2012-01-14 10 views
12

Sto studiando ARC. E ora sull'azzeramento dell'indicatore debole. OK Ho capito tutte le funzionalità. La semantica di di riferimento debole è esattamente la stessa cosa con riferimento debole del sistema GC, ma sai, Objective-C non usa GC (eccetto casi speciali) quindi non riesco a capire come funziona.Come viene implementato il comportamento del puntatore debole di azzeramento dell'ARC?

Sono un ragazzo un po 'complicato, quindi ho bisogno di conoscere il principio di implementazione sottostante per accettare la funzione da utilizzare. Ma il problema è che è molto difficile trovare il documento che descrive il principio di azzeramento-debole puntatore :(

IMO, l'unico modo per fare questo lavoro sta rintracciando e mantenendo tutti i puntatori stesso fanno riferimento in fase di esecuzione, e l'impostazione tutti nil quando il suo conteggio riferimento diventa 0. Ma questo sembra troppo pesante e stupido. credo molto meglio soluzione utilizzata in concreta attuazione ARC.

mi potete aiutare a trovare la documentazione, o descrizione diretta sarebbe più grande!

risposta

17

È spiegato qui:

http://mikeash.com/pyblog/friday-qa-2010-07-16-zeroing-weak-references-in-objective-c.html

Spoiler:

Funziona più o meno come si potrebbe pensare. Ogni classe mantiene un insieme di indirizzi di puntatori deboli che puntano ad esso, e quando viene chiamato il suo dealloc li imposta tutti a zero.

Può sembrare stupido, ma è veloce perché non c'è alcun "tracciamento" coinvolto, ARC inserisce semplicemente il codice per aggiungere un puntatore a quel set ogni volta che l'oggetto viene assegnato a un nuovo riferimento debole.

In realtà è molto più efficiente dell'inganno implicato nella raccolta dei dati inutili, che consiste essenzialmente nell'intrufolarsi nell'heap in un thread in background alla ricerca di puntatori e nel tenere traccia di ciò a cui stanno puntando.

+2

Infatti, sotto ARC, il compilatore emette il codice per chiamare funzioni come 'objc_storeWeak' e' objc_loadWeakRetain'. Queste funzioni sono un'API documentata: http://clang.llvm.org/docs/AutomaticReferenceCounting.html#runtime –

+0

Sì, e queste funzioni sono il modo in cui aggiunge e rimuove i puntatori deboli dal set archiviato nell'oggetto, come ho affermato quando ho detto "ARC aggiunge solo il codice per aggiungere un puntatore a quel set ogni volta che l'oggetto viene assegnato a un nuovo riferimento debole" –

+0

Sai se il puntatore debole è azzerato nel momento in cui il conteggio dei riferimenti dell'oggetto scende a 0, o quando è de-allocato? Mi sono imbattuto in un problema ora con un puntatore "Assegna" in cui l'oggetto di riferimento è riutilizzato, ma viene ancora chiamato il suo dealloc, perché il suo conteggio di riferimento è sceso a 0 in mezzo. Mi stavo chiedendo se un puntatore debole azzerato lo risolvesse. – fishinear

Problemi correlati