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
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.
nonatomicè opportuno che essa non può accedere contemporaneamente da più thread. L'impostazione predefinita è atomicche 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.
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 '...
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.
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è 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".