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.
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:
Questa risposta ha numerosi errori ed è anche obsoleta. Si prega di vedere altre domande / risposte e commenti.
nonatomic
nonatomic
viene 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 assign
proprietà, 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 @synthesize
manterrà (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 strong
e weak
per iOS 5.
http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1
Debole
weak
è simile ad strong
eccezione 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.
nonatomic
è opportuno che essa non può accedere contemporaneamente da più thread. L'impostazione predefinita è atomic
che lo rende thread sicuro.
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.
strong
viene 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 strong
significa che sei il proprietario dell'oggetto.
weak
la 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.
copy
la proprietà è molto ben spiegata qui
strong,weak,retain,copy,assign
si escludono a vicenda, quindi non puoi usarli su un singolo oggetto ... leggi la sezione "Proprietà dichiarate"
sperando che questo ti aiuti un po '...
nonatomic
significa solo che non viene applicata alcuna esclusione. Ciò non significa che l'accesso non sia thread-safe. Questo è un dettaglio di implementazione che atomic
vs. nonatomic
non acquisisce.
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à.
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è atomic
garantirà 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 dict
sarà letto / impostato in modo atomico da diversi thread. MA lo dict
stesso (il dizionario che dict
punta 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".