2012-03-25 9 views
277

Qualcuno può spiegare a me in dettaglio quando devo usare ogni attributo: nonatomic, copy, strong, weak, e così via, per una proprietà dichiarata, e spiega cosa fanno ciascuno? Una sorta di esempio sarebbe anche grandioso. Sto usando ARC.Objective-C ha dichiarato attributi @property (nonatomic, copiare, forte, debole)

+0

Ecco la risposta http://stackoverflow.com/a/32942413/1961064 –

+0

http://rypress.com/tutorials/objective-c/properties questo spiega tutto –

risposta

547

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


nonatomic

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

Copia

copy è richiesto quando l'oggetto è mutevole. 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. Avrai bisogno di rilasciare l'oggetto quando hai finito con esso perché stai mantenendo la copia.

Assegna

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

Retain

retain è richiesto quando l'attributo è un puntatore ad un oggetto. Il setter generato da @synthesize manterrà (con l'aggiunta di un conteggio di ritenzione a) l'oggetto. Avrai bisogno di rilasciare l'oggetto quando hai finito con esso. Usando retain lo farà aumentare il conteggio dei ritardi e occuperà la memoria nel pool autorelease.

Strong

strong è un sostituto per l'attributo trattenere, come parte di Objective-C Automated Reference Counting (ARC). Nel codice non ARC è solo un sinonimo di retain.

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 a strong salvo che non aumenterà il numero di riferimento di 1. Non diventa un proprietario di quell'oggetto, ma tiene semplicemente un riferimento ad esso. Se il numero di riferimento dell'oggetto scende a 0, anche se potresti ancora puntarlo qui, verrà deallocato dalla memoria.

Il collegamento precedente contiene sia Buone informazioni riguardanti Debole e Forte.

+0

Grazie per la spiegazione, ho alcune domande però, 1. Ho la mia classe dati principale, in questa classe ho tutti gli attributi impostati su strong. Quindi, quando sto creando un'altra classe, ho un valore variabile di NSString che ottiene valore da una casella di testo, fare questo valore NSString dovrebbe di tipo debole? scusa per le domande noob che stanno ancora imparando ... –

+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 quanto non lo farò io consiglia (forte, copia). –

+1

Manca la proprietà Assegna. – mskw

17

Questo legame ha la rottura

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

assegnare implica proprietà __unsafe_unretained.

la copia implica __di proprietà estesa, nonché il comportamento normale della copia semantica sul setter.

conservazione implica __di proprietà estesa.

forte implica __di proprietà estesa.

unsafe_unretained implica __unsafe_unretained ownership.

debole implica __Bassa proprietà.

+0

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

44

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

strong viene utilizzato con ARC e in pratica aiuta a non doversi preoccupare del numero di ritenzione di un oggetto. ARC lo rilascia automaticamente quando hai finito. Utilizzare la parola chiave strong significa che sei il proprietario dell'oggetto.

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

copy proprietà è molto ben explained here

strong,weak,retain,copy,assign si escludono a vicenda in modo non è possibile utilizzare su un unico oggetto ... leggere il "Declared Properties " sezione

sperando che questo ti aiuta un po '...

+0

perché forte, debole, conserva, copia, assegna escluso –

+0

'nonatomico' significa solo che non viene applicata alcuna esclusione. Ciò non significa che l'accesso non è thread-safe. Questo è un dettaglio di implementazione che 'atomic' vs.' nonatomic' non cattura. – bbum

+0

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

9

Grandi risposte! Una cosa che vorrei chiarire più a fondo è nonatomic/atomic. L'utente deve comprendere che questa proprietà - "atomicità" si diffonde solo sul riferimento dell'attributo e non sul suo contenuto. I.e. atomic garantirà all'utente l'atomicità per la lettura/impostazione del puntatore e solo il puntatore all'attributo. Ad esempio:

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

In questo caso è garantito che il puntatore alla dict verrà letto/impostato nel modo atomico da diversi thread. MA il dict stesso (il dizionario dict che punta a) è ancora thread non sicuro, cioè tutte le operazioni di lettura/aggiunta al dizionario sono ancora thread non sicure.

Se è necessaria la raccolta sicura dei thread, si ha una cattiva architettura (più spesso) o un requisito reale (più raro). Se è un "requisito reale", dovresti trovare un buon componente di raccolta sicuro per il thread, & OPPURE essere preparato per prove e tribolazioni scrivendo il tuo. In quest'ultimo caso guardate i paradigmi "lock-free", "wait-free". Sembra una scienza missilistica a prima vista, ma potrebbe aiutarti a ottenere prestazioni fantastiche rispetto al "solito blocco".

Problemi correlati