Conteggio riferimento automatico (ARC) vengono introdotti alcuni nuovi tipi di qualificatore. Ho visto __strong
e __weak
, ma cosa fanno?Quali sono i nuovi qualificatori di tipo introdotti con ARC?
risposta
__strong
significa che in fase di assegnazione, il valore dell'espressione verrà mantenuto e memorizzato nel lvalue utilizzando la semantica primitiva. (Per rilasciare un oggetto del genere, tutto quello che devi fare è assegnarlo nil
, l'oggetto in precedenza di riferimento sarà rilasciato, nil
saranno mantenuti, che fa in modo efficace nulla ed è rose e fiori.)
__unsafe_unretained
e __weak
sono simili a il senso che l'indirizzo del valore di valore sarà assegnato al lvalue, ma se si utilizza il qualificatore __weak
, questa operazione è garantita per essere atomica e soggetta ad alcune semantiche diverse. Uno di questi è che se l'oggetto che viene assegnato è attualmente in fase di deallocation, il compito verrà valutato a nil
e verrà quindi archiviato in modo atomico nel lvalue dell'espressione. Da qui la formulazione __unsafe_unretained
, perché tale operazione è davvero insicuri e non mantenuta.
__autoreleasing
è come __strong
eccetto che ha un avvertimento: l'oggetto conservato viene spinto sulla piscina autorelease corrente, in modo da poter, ad esempio ottenere la proprietà temporanea di un oggetto per rimuoverlo da una raccolta e poi tornare indietro al chiamante . Ci sono altri usi per questo, ma hanno principalmente a che fare con il possesso temporaneo di un oggetto.
Questi comportamenti si presentano anche nei corrispondenti modificatori di proprietà (strong
, unsafe_unretained
e weak
).
Vedi l'EDIT Clang Automatic Reference Counting Technical Specification
: Per quei iOS non rivolti 5 e quindi in grado di raccogliere i frutti di __weak
, Mike Ash wrote a superb article (e realizzazione) su azzeramento riferimenti deboli che si può usare invece.
Forte dice ad ARC di conservare la proprietà.
@property (strong,nonatomic) NSObject *object;
@property (retain,nonatomic) NSObject *object;
Debole è essenzialmente assegnare, una proprietà non trattenuta. Tranne il caso in cui l'oggetto viene deallocato, il puntatore debole viene automaticamente impostato su zero.
@property (weak,nonatomic) NSObject *object;
@property (assign,nonatomic) NSObject *object;
Debole è disponibile solo su iOS 4.3 e versioni successive. Se vuoi scegliere come target iOS 4.2, devi usare unsafe_unretained, che funzionerà esattamente come l'assegnamento utilizzato.
Su Mac OS X, 'weak' è disponibile solo da Lion; il tuo consiglio su iOS 4.2 vale anche per Snow Leopard. –
@NJones, tuttavia ho una domanda. Come diavolo può 'debole' essere' nonatomico'? 'weak' * per definizione * è' atomic'. –
@JacobRelkin. Questa è una bella domanda. Suppongo che il non anatomico sia smentito dal modificatore debole.Ma è così che è fatto; Solo per controllare ho iniziato un nuovo progetto Xcode, aggiunto un'etichetta, e poi ho collegato una presa abbastanza sicura da darmi l'etichetta '@property (weak, nonatomic) IBOutlet UILabel *'. – NJones
I qualificatori di tipo sono __autoreleasing
, __strong
, __unsafe_unretained
e __weak
. I modificatori di proprietà sono strong
, unsafe_unretained
e weak
.
Dai un'occhiata a section 4 of Automatic Reference Counting nella documentazione LLVM/Clang.
Come si rende l'oggetto 'unsafe__unretain' più sicuro? Voglio dire, se non viene girato a 'nil' automaticamente dal compilatore, come dovremmo gestire questo oggetto penzolante? –
@MohammadAbdurraafay In questo caso puoi usare '__weak' ... –
Se non sbaglio' __weak' non è disponibile nelle versioni successive di iOS, allora in quel caso come farò rendere l'oggetto 'unsafe__unretain' più sicuro, che non è impostato su 'nil' automaticamente? –