Вопрос по ios, objective-c – Будет ли связанный объект выпущен автоматически?

14

Примечание. Этот другой вопрос представляется актуальным, но это не так:Когда связанный объект освобождается?

Я добавляю второе описание кUIView пример следующим образом:

- (void) setSecondDescription:(UIView*)view description2:(NSString*)description2 {
    objc_setAssociatedObject (view,&key,description2,OBJC_ASSOCIATION_RETAIN);
}

- (NSString*) secondDescription:(UIView*)view {
    return (id)objc_getAssociatedObject(view, &key);   
}

ЕслиUIView deallocs, будет ли связанное описание 2 освобождено? Есть ли способ, чтобы это произошло автоматически?

Ваш Ответ

4   ответа
3

любые связанные объекты (которые используютRETAIN или жеCOPY типы ассоциации) автоматически освобождаются.

64

see описание всей временной шкалы dealloc смотрите на WWDC 2011, сессия 322, 36:22. Тем не менее, вот основное краткое изложение (я хотел запомнить это, так что это фактический комментарий в части моего кода).

Обратите внимание, что связанные объекты освобождаются в конце жизненного цикла.

// General Information
// We take advantage of the documented Deallocation Timeline (WWDC 2011, Session 322, 36:22).
// 1. -release to zero
//     * Object is now deallocating and will die.
//     * New __weak references are not allowed, and will get nil.
//     * [self dealloc] is called
// 2. Subclass -dealloc
//     * bottom-most subclass -dealloc is called
//     * Non-ARC code manually releases iVars
//     * Walk the super-class chain calling -dealloc
// 3. NSObject -dealloc
//     * Simply calls the ObjC runtime object_dispose()
// 4. object_dispose()
//     * Call destructors for C++ iVars
//     * Call -release for ARC iVars
//     * Erase associated references
//     * Erase __weak references
//     * Call free()
Это отличная информация, Джоди, спасибо. Просто добавлю, что я обнаружил, что в iOS4, если вы добавляете связанные объекты к объекту, который также зарегистрирован как наблюдатель, связанные объекты никогда не будут освобождены, даже если объект действительно будет освобожден. Поэтому использование KVO в сочетании со связанными объектами в iOS4 как-то разрывает эту цепочку.
+1 Это классно, Джоди. Возможно, мне придется смотреть сеанс, так как я не могу понять,where этот код будет расположен. Но это скорее мое отсутствие понимания того, как Obj-C составлен, чем что-либо еще. Dan Rosenstark
Когда счетчик ссылок становится равным 0, объект начинает умирать, и этот путь кода выполняется. Есть некоторые настройки, запрещающие новые слабые ссылки, и некоторые другие вещи, и затем начинается цепочка Deloc. Когда цепочка dealloc завершена, это когда все переменные экземпляра уничтожены (в рамках ARC). Связанные объекты - это просто карта, которая прикреплена вместе с остальными элементами (ну, раньше это был std :: map & lt; & gt; - в последнее время я не смотрел, но я действительно хотел, чтобы они использовали массив для небольшое количество связанных объектов, затем используйте карту позже - для ограничения потребления памяти).
0

ответ говорит "Удалить связанные ссылки", что явно не означает, что ссылки освобождены. Поэтому я использовал следующий фрагмент кода (обратите внимание, без дуги), чтобы проверить это.

@interface AssociatedObjectHelper : NSObject
@end

@implementation AssociatedObjectHelper
- (void) dealloc
{
    NSLog(@"In %s", __FUNCTION__);
    [super dealloc];
}
@end

@implementation AppDelegate
...
- (void) testReleaseAssociatedObject
{
    static const NSString *key = @"testKey123";
    NSObject *ob = [NSObject new];
    AssociatedObjectHelper *assocOb = [AssociatedObjectHelper new];
    objc_setAssociatedObject(ob, key, assocOb, OBJC_ASSOCIATION_RETAIN);
    [assocOb release];
    [ob release];
}

Вызов вышеприведенного кода действительно в итоге вызывает - [AssociatedObjectHelper dealloc] со следующей трассировкой стека:

#0  0x000000010000528f in -[AssociatedObjectHelper dealloc]
#1  0x00007fff8a0bb89c in objc_object::sidetable_release(bool) ()
#2  0x00007fff8a0a537f in _object_remove_assocations ()
#3  0x00007fff8a0a1644 in objc_destructInstance ()
#4  0x00007fff8a0a1595 in object_dispose ()
#5  0x00007fff8a0bb89c in objc_object::sidetable_release(bool) ()
#6  0x000000010000e9b6 in -[AppDelegate testReleaseAssociatedObject]

Протестировано на Xcode 7.0.1

3

Короче говоря, да - когда объект-владелец освобождается, освобождаются связанные объекты. См. Первый раздел Appleдокументация

Спасибо @borrrden, что помогает. Dan Rosenstark
@ Яр достаточно ясно во втором-последнем предложении первого раздела (Создание ассоциаций): «Однако, когда массив освобождается (в точке 2), обзор освобождается и поэтому в этом случае также освобождается». :)
Я видел этот раздел. Где говорится, что он выпущен? Dan Rosenstark

Похожие вопросы