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