Objective-C ha dichiarato gli attributi @property (nonatomico, copia, forte, debole)


289

Qualcuno può spiegare a me in dettaglio quando devo usare ogni attributo: nonatomic, copy, strong, weak, e così via, per una proprietà dichiarata, e spiegare ciò che ciascuno fa? Anche una sorta di esempio sarebbe fantastico. Sto usando ARC.



Risposte:


559

Questa risposta ha numerosi errori ed è anche obsoleta. Si prega di vedere altre domande / risposte e commenti.


nonatomic

nonatomicviene utilizzato per scopi multi threading. Se al momento della dichiarazione abbiamo impostato l'attributo nonatomico, qualsiasi altro thread che desidera accedere a quell'oggetto può accedervi e dare risultati rispetto al multi-threading.

copia

copyè richiesto quando l'oggetto è mutabile. Usalo se hai bisogno del valore dell'oggetto così com'è in questo momento e non vuoi che quel valore rifletta le modifiche apportate da altri proprietari dell'oggetto. Dovrai rilasciare l'oggetto al termine perché stai conservando la copia.

Assegnare

Assignè un po 'l'opposto di copy. Quando si chiama il getter di una assignproprietà, restituisce un riferimento ai dati effettivi. In genere si utilizza questo attributo quando si possiede una proprietà di tipo primitivo (float, int, BOOL ...)

conservare

retainè richiesto quando l'attributo è un puntatore a un oggetto. Il setter generato da @synthesizemanterrà (ovvero aggiungerà un conteggio di mantenimento a) l'oggetto. Dovrai rilasciare l'oggetto al termine. Usando il mantenimento, aumenterà il conteggio del mantenimento e occuperà la memoria nel pool di rilascio automatico.

Forte

strongè un sostituto dell'attributo keep, come parte del conteggio di riferimento automatizzato Objective-C (ARC). Nel codice non ARC è solo un sinonimo di trattenere.

Questo è un buon sito web per conoscere stronge weakper iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

Debole

weakè simile ad strongeccezione del fatto che non aumenterà il conteggio dei riferimenti di 1. Non diventa un proprietario di quell'oggetto ma ne detiene solo un riferimento. Se il conteggio dei riferimenti dell'oggetto scende a 0, anche se è possibile puntarlo ancora qui, verrà deallocato dalla memoria.

Il link sopra contiene sia buone informazioni riguardanti debole che forte.


1
se stai usando questo NSString solo internamente in quella classe stessa di quanto non hai nemmeno bisogno di una proprietà puoi semplicemente renderlo un iVar e se lo stai usando in un'altra classe di quella che ti consiglierò (forte, copia).
Ankit Srivastava,

1
Manca la proprietà Assign.
mskw,

10
nonatomicè opportuno che essa non può accedere contemporaneamente da più thread. L'impostazione predefinita è atomicche lo rende thread sicuro.
wcochran,

1
È un po 'inquietante che dopo tutto questo tempo la definizione di nonatomico sia ancora sbagliata e assomigli ad atomica. Mi chiedo quante persone lo abbiano usato negli ultimi cinque anni e abbiano avuto l'impressione sbagliata. Cosa ha detto @wcochran era corretto. nonatomico significa che l'accesso al puntatore non è gestito atomicamente e quindi non è sicuro per i thread. Il vantaggio, come ho capito, di non anatomico è che è più leggero.
John Bushnell,

1
Oltre al commento di @JohnBushnell ci sono molti altri errori e imprecisioni in questa risposta. Inoltre non è invecchiato bene, quindi è piuttosto storico. Vai a cercare altrove se cerchi una risposta a questa domanda.
CRD

45

nonatomic La proprietà afferma che l'oggetto non è thread-safe, il che significa che se un thread diverso tenta di accedere a questo oggetto di quanto possano accadere cose brutte ma questo è molto più veloce della proprietà atomica.

strongviene utilizzato con ARC e sostanzialmente ti aiuta, non dovendo preoccuparti del conteggio di mantenimento di un oggetto. ARC lo rilascia automaticamente per te quando hai finito con esso. L'uso della parola chiave strongsignifica che sei il proprietario dell'oggetto.

weakla proprietà significa che non lo possiedi e tiene traccia dell'oggetto fino a quando l'oggetto a cui è stato assegnato rimane, non appena il secondo oggetto viene rilasciato perde valore. Per es. obj.a=objectB;viene utilizzato e ha una proprietà debole, quindi il suo valore sarà valido solo finché l'oggetto B rimane in memoria.

copyla proprietà è molto ben spiegata qui

strong,weak,retain,copy,assignsi escludono a vicenda, quindi non puoi usarli su un singolo oggetto ... leggi la sezione "Proprietà dichiarate"

sperando che questo ti aiuti un po '...


perché forte, debole, trattenere, copiare, assegnare reciprocamente esclusivi
vinoth.kumar

nonatomicsignifica solo che non viene applicata alcuna esclusione. Ciò non significa che l'accesso non sia thread-safe. Questo è un dettaglio di implementazione che atomicvs. nonatomicnon acquisisce.
bbum

@bbum Puoi spiegare la differenza tra nessuna esclusione e non thread-safe ..?
Ankit Srivastava,

1
L' esclusione di @AnkitSrivastava è quando il thread A impedisce al thread B di scendere da un percorso di codice. Se il percorso del codice è sicuro per l'esecuzione da più thread, l'esclusione non è necessaria. Non thread-safe significa che il percorso del codice può produrre risultati indefiniti se A e B lo discendono contemporaneamente. Questa è l' esclusione che può essere utilizzata per rendere sicuro il thread, ma la sicurezza del thread non richiede l'esecuzione esclusiva, non simultanea.
bbum

17

Questo link ha una suddivisione

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property

assegnare implica __unsafe_unretained proprietà.

copia implica __strong proprietà, così come il solito comportamento della semantica della copia sul setter.

conservare implica __strong proprietà.

forte implica __strong proprietà.

unsafe_unretained implica __unsafe_unretained proprietà.

debole implica __ debole proprietà.


la proprietà Assign non è utilizzata solo per iVar e valori? Quindi perché non è sicuro e perché è necessario notare che non è trattenuto?
mskw

9

Grandi risposte! Una cosa che vorrei chiarire più a fondo è nonatomic/ atomic. L'utente dovrebbe capire che questa proprietà - "atomicità" si diffonde solo sul riferimento dell'attributo e non sul suo contenuto. Cioè atomicgarantirà l'atomicità dell'utente per leggere / impostare il puntatore e solo il puntatore all'attributo. Per esempio:

@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...

In questo caso è garantito che il puntatore a dictsarà letto / impostato in modo atomico da diversi thread. MA lo dictstesso (il dizionario che dictpunta a) è ancora thread non sicuro , cioè tutte le operazioni di lettura / aggiunta al dizionario sono ancora thread non sicure.

Se hai bisogno di una raccolta thread-safe hai una cattiva architettura (più spesso) O requisiti reali (più rari). Se è un "vero requisito", dovresti trovare un componente di raccolta sicuro e testato per thread o essere preparato per prove e tribolazioni scrivendo il tuo. In quest'ultimo caso guardiamo ai paradigmi "senza blocco", "senza attesa". Sembra una scienza missilistica a prima vista, ma potrebbe aiutarti a ottenere prestazioni fantastiche rispetto al "solito bloccaggio".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.