2013-07-10 7 views
11

Si dice che l'opzione nonatomic renderà più veloce il tuo metodo di impostazione . Ho cercato su Google ma non sono in grado di capire. Qualcuno potrebbe dirmi perché?Perché si dice che le proprietà siano sempre non anatomiche nell'obiettivo C?

+4

http://stackoverflow.com/questions/588866/atomic-vs-nonatomic-properties – Desdenova

+3

http://stackoverflow.com/questions/588866/atomic-vs-nonatomic-properties?rq=1 – peko

+0

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

risposta

51

La dichiarazione di una proprietà atomic consente al compilatore di generare codice aggiuntivo che impedisce l'accesso simultaneo alla proprietà. Questo codice aggiuntivo blocca un semaforo, quindi ottiene o imposta la proprietà e quindi sblocca il semaforo. Rispetto all'impostazione o al recupero di un valore primitivo o di un puntatore, il blocco e lo sblocco di un semaforo è costoso (sebbene di solito è trascurabile se si considera il flusso generale della propria app).

Poiché la maggior parte delle classi sotto IOS, in particolare quelli legati alla UI, sarà utilizzato in un ambiente a thread singolo, è sicuro per cadere atomic (cioè scrivere nonatomic, perché le proprietà sono atomic di default): anche se l'operazione è relativamente economica, non vuoi pagare per cose che non ti servono.

+1

1+ La parte relativa alla sicurezza di rilasciare atomico per le proprietà dell'interfaccia utente poiché dovrebbe sempre essere aggiornato sul thread principale in ogni caso –

+12

Si potrebbe voler chiarire che al fine di " rilascia "atomic', devi usare esplicitamente' nonatomic' perché 'atomic' è l'impostazione predefinita per le proprietà; se non si specifica nulla, si ottiene 'atomic'. – Caleb

+0

@Caleb Ottimo commento, grazie! – dasblinkenlight

7

vedere la differenza tra atomico e nonatomic in Objective C

atomica

atomica è il comportamento predefinito per una proprietà; non impostando esplicitamente la proprietà di cui sopra come nonatomico, sarà atomico.

Una proprietà atomica aggiunge un livello di sicurezza del filo durante il recupero o l'impostazione dei valori. Cioè, il getter e il setter per la proprietà saranno sempre completati a prescindere da ciò che altri thread stanno facendo. Il compromesso è che queste proprietà avranno un accesso un po 'più lento di un equivalente nonatomico.

non Atomic

proprietà nonatomic non sono thread-safe, e tornerà direttamente le loro proprietà. Questo sarà più veloce delle proprietà atomiche, ma ovviamente comporta dei rischi se non vengono prese precauzioni.

+1

> 'assicurerà che il processo presente sia completato dalla CPU, prima che un altro processo acceda alla variabile' non implica la sicurezza del thread? – powerj1984

+0

Ho la stessa domanda di @ powerj1984 – Ricardo

3
@property (strong) NSString *str; 

atomica è il comportamento predefinito per una proprietà; non impostando esplicitamente la proprietà di cui sopra come nonatomico, sarà atomico.

setter & getter per queste atomica proprietà

-(NSString *) str{ 
@synchronized(self){ 
return str; 
}} 

-(void) setStr: (NSString *) newString { 
@synchronized(self)  { 
str = newString; 
}} 

Una proprietà atomica aggiunge un livello di sicurezza thread quando ottenere o impostare i valori. Cioè, il getter e il setter per la proprietà saranno sempre completati a prescindere da ciò che altri thread stanno facendo. queste proprietà avranno un accesso un po 'più lento di un equivalente nonatomico.

@property (strong,nonatomic) NSString *str; 

nonatomic proprietà non sono thread sicuro, e si ritorna direttamente le loro proprietà. Questo sarà più veloce delle proprietà atomiche, ma ovviamente comporta dei rischi se non vengono prese precauzioni.

setter & getter per queste nonatomic proprietà

-(NSString *) str{ 
    return str; 
    }} 

-(void) setStr: (NSString *) newString{ 
str = newString; 
} 

Così, cercando sui setter & metodi getter sia per atomica & nonatomic che i metodi nonatomic sono molto leggero.

+0

Il tuo codice funzionerà solo con ARC. Poiché ARC garantisce l'atomicità sull'assegnazione di un oggetto, quest'ultimo esempio è in realtà atomico. Nota che le proprietà di 'NSString' dovrebbero sempre essere dichiarate come' copia'. – bbum

Problemi correlati