2011-10-31 19 views

risposta

32

__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.

+0

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? –

+0

@MohammadAbdurraafay In questo caso puoi usare '__weak' ... –

+0

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? –

4

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.

+0

Su Mac OS X, 'weak' è disponibile solo da Lion; il tuo consiglio su iOS 4.2 vale anche per Snow Leopard. –

+0

@NJones, tuttavia ho una domanda. Come diavolo può 'debole' essere' nonatomico'? 'weak' * per definizione * è' atomic'. –

+0

@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

1

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.

Problemi correlati