Я столкнулся со странным поведением 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
NSObject
, ивары AFAIR можно добавлять только в категорию расширения класса, а не в произвольную. - person iHunter   schedule 03.01.2012@interface NSObject (MyCat) { int myivar; } @end
-› Иваров нельзя размещать в категориях - person iHunter   schedule 03.01.2012