Я столкнулся со странным поведением objc_setAssociatedObject
при ARC.Рассмотрим следующий код:
static char ASSOC_KEY;
@interface DeallocTester : NSObject
@end
@implementation DeallocTester
- (void) dealloc
{
NSLog(@"DeallocTester deallocated");
//objc_setAssociatedObject(self, &ASSOC_KEY, nil, OBJC_ASSOCIATION_RETAIN);
}
@end
@implementation AppDelegate
- (void) applicationDidFinishLaunching:(UIApplication *)application
{
NSObject *test = [[DeallocTester alloc] init];
objc_setAssociatedObject(test, &ASSOC_KEY, [[DeallocTester alloc] init],
OBJC_ASSOCIATION_RETAIN);
}
Я создаю экземпляр DeallocTester
, затем я устанавливаю еще один DeallocTester
в качестве связанного с ним объекта, затем оба они выходят за рамки.
Я ожидаю, что будет вызван -dealloc
первого объекта, а затем связанный объект будет освобожден, но я вижу сообщение "DeallocTester deallocated"
, напечатанное только один раз.Если я раскомментирую строку objc_setAssociatedObject
в -dealloc
, второй объект также будет освобожден.
Ссылка Objective C указывает, что связанные объекты автоматически освобождаются при уничтожении объекта.Это компилятор / ARC / что-то еще, или я что-то упустил?
Обновление
Этот пример кода на самом деле работает, если вы запускаете его из совершенно нового проекта,Но у меня есть два проекта с поддержкой ARC, где это не так.Я сделаю небольшое исследование и предоставлю лучший образец.
Обновление 2
Я заполнил rdar: // 10636309, Утечка связанных объектов, еслиОбъекты NSZombie включены в проекте с поддержкой ARC