Я столкнулся со странным поведением 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/whatever или я что-то упускаю?
Обновление
Этот пример кода действительно работает, если запустить его из совершенно нового проекта. Но у меня есть два проекта с поддержкой ARC, где он не работает. Я проведу небольшое расследование и предоставлю лучший пример.
Обновление 2
Я заполнил rdar://10636309, Associated objects leaking if NSZombie objects enabled in ARC-enabled project