Ho riscontrato un comportamento strano objc_setAssociatedObject
sotto ARC. Si consideri il seguente codice:Oggetti associati Objective-C che perdono sotto 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);
}
Sto creando un'istanza di DeallocTester
, poi ho impostato un altro DeallocTester
come un oggetto associato per esso, allora entrambi andare fuori del campo di applicazione.
Mi aspetto che lo -dealloc
del primo oggetto da chiamare, quindi l'oggetto associato sia deallocato, ma vedo il messaggio "DeallocTester deallocated"
stampato solo una volta. Se si decommenta la riga objc_setAssociatedObject
in -dealloc
, anche il secondo oggetto viene deallocato.
Il riferimento Objective-C indica che gli oggetti associati vengono deallocati automaticamente in caso di distruzione dell'oggetto. È un compilatore/ARC/Qualunque problema o mi manca qualcosa?
Aggiornamento
codice Questo esempio è in realtà di lavoro se lo si esegue da un progetto nuovo di zecca. Ma ho due progetti abilitati ARC che non funziona. Farò qualche ricerca e fornirò un campione migliore.
Aggiornamento 2
Ho riempito un rdar://10636309, Associated objects leaking if NSZombie objects enabled in ARC-enabled project
Se si utilizza LLVM3 + perché stai usando gli oggetti associati ? Puoi semplicemente creare iVar e le proprietà in categorie sulla classe. – Abizern
@Abizern Ho intenzione di aggiungere ivars a 'NSObject', i ivar di AFAIR possono essere aggiunti solo a una categoria di estensione di classe, non a una di classe arbitraria. – iHunter
@Abizern Davvero? Come crei un ivar in una categoria? – jlehr