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.
- 1. Quali sono le garanzie per i qualificatori di accesso scala?
- 2. Quali OpCode sono stati introdotti in CLR 4.0?
- 3. Quali sono i qualificatori const di livello superiore?
- 4. Quali sono i vantaggi e gli svantaggi dell'utilizzo di ARC?
- 5. Per ARC o non per ARC? Quali sono i pro e i contro?
- 6. Quali sono disponibili i tasti "Additional Metadata" nel saldatore ARC
- 7. Nuovi attributi delle proprietà ARC
- 8. Tipo di argomento per segnale Qt e slot, i qualificatori di riferimento const sono importanti?
- 9. È troppo presto per usare ARC per i nuovi progetti?
- 10. Quali sono i limiti di inferenza di tipo?
- 11. IntelliSense: l'oggetto ha tipo qualificatori che non sono compatibili con la funzione membro
- 12. Quali sono i problemi reali con Ruby?
- 13. Ricerca di un'attività di build che interrompe una build quando vengono introdotti nuovi avvisi
- 14. Quali sono i veri vantaggi di ExpandoObject?
- 15. Quali sono i migliori trucchi di debugging con Weld/CDI?
- 16. WELD-001408: Dipendenze insoddisfatte per tipo Cliente con qualificatori @Default
- 17. Quali sono i "riferimenti rvalue per * questo" per?
- 18. l'oggetto ha tipo qualificatori che non sono compatibili con la funzione membro
- 19. Quali sono i vantaggi di NSBinaryStoreType?
- 20. I Comparatori sono oggetti nuovi o iniettabili?
- 21. Quali sono i vantaggi dell'utilizzo di automapper?
- 22. Dipendenze insoddisfatte per il tipo X con qualificatori @Default
- 23. tipo generico Quali sono implicite Parametri
- 24. associazione di riferimento a un valore di tipo drops qualificatori
- 25. Quali sono i vantaggi dell'utilizzo di WCF?
- 26. quali sono i vantaggi dell'uso di scrapyd?
- 27. Quali sono i vantaggi di JRebel?
- 28. Quali sono i rischi delle sessioni PHP?
- 29. Quali sono i migliori componenti di Boost?
- 30. Quali sono i vantaggi dell'uso di Elixir
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? –