Mike Ash has written this introduction to ARC dove introduce qualcosa di simile:Quando e perché dovrei dichiarare una variabile locale come __weak usando ARC?
__weak Foo *_weakFoo = [object foo];
perché dovrei farlo per una variabile locale, temporanea? __weak è un riferimento di azzeramento che imposterà automaticamente il puntatore _weakFoo su zero non appena l'oggetto referenziato viene deallocato. Inoltre, __weak è disponibile solo in iOS> = 5.
Quando avrei incontrato difficoltà quando ho semplicemente faccio ?:
Foo *_weakFoo = [object foo];
Questo è sempre tenuto a restituire un oggetto o nullo. La mia ipotesi è questa:
Foo *_weakFoo = [object foo];
[self doSomethingStupid]; // does something bad so foo gets deallocated
[_weakFoo doIt]; // CRASH! msg sent to deallocated instance 0x123456
Una cosa che ancora mi bug con arco è: quando si fa a sapere che non ho più bisogno di un oggetto? Direi che quando imposto un puntatore su nil o su qualcos'altro, si scopre che l'oggetto precedentemente referenziato non è più necessario da questo proprietario e quindi forse può andare via. Ma il punto è: l'ho impostato su zero. Quindi è comunque zero!
Quindi, quando è necessario un errore per una variabile locale, e quale tipo di cosa pazza devo fare da qualche altra parte in modo che ne abbia davvero bisogno?
Come potrebbe esserci un ciclo di conservazione? – openfrog
@openfrog - Questo particolare blocco potrebbe non essere a rischio maggiore di essere un ciclo di conservazione, ma quello che ho incontrato sarebbe osservatori basati su blocchi per le notifiche (usando NSNotificationCenter's -addObserverForName: object: queue: usingBlock: '). Se si imposta un tale osservatore in un oggetto e si fa riferimento a qualcosa su 'self', si imposta un ciclo mentre l'oggetto rimane sul blocco e il blocco rimane sull'oggetto. –
Dopo aver scritto ciò, mi sono reso conto che questo non è il miglior esempio perché dispatch_async() copia il blocco, ma solo fino alla fine del metodo. Un esempio migliore sarebbe stato l'utilizzo di NSBlockOperation poiché un'istanza di tale proprietà possiede il blocco passato per la durata dell'oggetto, rendendo più probabili i cicli di conservazione. –