2012-12-06 10 views
7

Si consideri quanto segue: Un'istanza di una classe Objective-C è referenziata da un riferimento forte e un riferimento debole (in ARC). Sul thread X, un metodo viene chiamato sull'istanza tramite il riferimento debole. Sul thread Y, il riferimento forte viene interrotto in modo tale che non vi siano più riferimenti forti all'istanza e deve essere deallocato.Un oggetto Objective-C può essere deallocato mentre un metodo di istanza viene invocato su di esso?

Questa situazione è possibile, in quanto l'oggetto potrebbe essere deallocato sul thread Y mentre il metodo è in esecuzione sul thread X? Allo stesso modo, invocare un metodo su un oggetto "conserva" quell'oggetto fino a quando il metodo non ritorna?

risposta

10

ARC mantiene effettivamente i riferimenti deboli prima di chiamare i metodi di istanza su di essi e rilascia dopo la chiamata.

Stavo cercando questo problema ed è stato corretto da un collega dopo avergli mostrato questa domanda di stackoverflow. Indicò questo: http://lists.apple.com/archives/objc-language/2012/Aug/msg00027.html

Abbastanza sicuro, nell'assemblaggio, ARC conserva e rilascia attorno a un'invocazione su un riferimento debole.

Una volta che si desidera ascoltare CLANG_WARN_OBJC_RECEIVER_WEAK è per nil checks, quando nil potrebbe causare un errore.

if (self.weakRefToParent) { 
    //self.weakRefToParent could be dealloced and set to nil at this line 
    NSString *name = [self.weakRefToParent name]; //CLANG_WARN_OBJC_RECEIVER_WEAK warning 
    [self.namesArray addObject:name]; //name is nil, NSInvalidArgumentException 
} 

Questo è il modo più sicuro:

Parent *strongRefToParent = self.weakRefToParent; 
if (strongRefToParent) { 
    NSString *name = [strongRefToParent name]; 
    [self.namesArray addObject:name]; 
} 
+2

risposta Molto meglio (come in "accurata e in base alla risposta definitiva del compilatore autore"). Grazie! – bbum

Problemi correlati