J'ai rencontré un étrange comportement objc_setAssociatedObject
sous ARC. Considérez le code suivant:Objets associés Objective-C qui fuient sous 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);
}
Je crée une instance de DeallocTester
, je mets une autre DeallocTester
comme un objet associé pour lui, alors tous les deux sont hors de portée.
Je m'attends à ce que le -dealloc
du premier objet soit appelé, puis l'objet associé à être libéré aussi, mais je vois le message "DeallocTester deallocated"
imprimé une seule fois. Si je décommente la ligne objc_setAssociatedObject
dans -dealloc
, le deuxième objet est également désalloué.
La référence Objective-C indique que les objets associés sont désalloués automatiquement lors de la destruction de l'objet. Est-ce un compilateur/ARC/quel que soit le problème ou ai-je oublié quelque chose?
Mise à jour
Ce code exemple fonctionne en fait, si vous l'exécutez à partir d'un projet flambant neuf. Mais j'ai deux projets ARC-enabled où ce n'est pas le cas. Je vais faire une enquête et fournir un meilleur échantillon.
Update 2
J'ai rempli un rdar://10636309, Associated objects leaking if NSZombie objects enabled in ARC-enabled project
Si vous utilisez LLVM3 + pourquoi vous utilisez des objets associés ? Vous pouvez simplement créer des iVars et des propriétés dans les catégories de la classe à la place. – Abizern
@Abizern Je vais ajouter des ivars à 'NSObject', les ivars AFAIR peuvent être ajoutés à une catégorie d'extension de classe seulement, pas arbitraire. – iHunter
@Abizern Vraiment? Comment créez-vous un ivar dans une catégorie? – jlehr