ho notato quanto segue in Objective-C con ARC abilitato:proprietà debole è impostata a zero in dealloc ma Ivar della struttura non è nullo
Diamo semplice classe A e autosynthesized proprietà debole
@interface A
@property (nonatomic, weak) id refObject;
@end
@implementation A
@end
E seconda classe B con dealloc implementato
@interface B
@end
@implementation B
-(void) dealloc
{
NSLog(@"In dealloc");
}
@end
E infine qualche parte in classe a sono i seguenti:
@implementation A
...
-(void) foo
{
B* b = [B new];
self.refObject = b;
// Just use b after the weak assignment
// in order to not dealloc 'b' before assignement
NSLog(@"%@", b);
}
...
@end
Se ho impostato un punto di interruzione in [B dealloc]
e controllare [A refObject]
proprietà Vedo che a.refObject
è pari a zero, ma a->_refObject
non è pari a zero e punti a 'b'
Tutte le idee perché ciò accade?
Forse il metodo accessor restituisce 'nil' quando sa che il ref debole deve essere cancellato, ma la variabile di istanza stessa viene lasciata intatta (e deallocata, e ora è un puntatore pendente). –
Penso che in dealloc l'oggetto sia ancora valido e non ancora cancellato. Ad esempio, si annulla la registrazione da NSNotificationCenter e si può accedere alle sue proprietà. –
"puoi accedervi" non significa necessariamente che non sia stato rilasciato, ma potrei sbagliarmi. –