Objective-C associated objects leaking under ARC

Я столкнулся со странным поведением 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

9
задан iHunter 3 January 2012 в 14:38
поделиться