Cosa significa la proprietà "Nonatomic"?


144

Cosa significa "nonatomico" in questo codice?

@property(nonatomic, retain) UITextField *theUsersName;

Qual'è la differenza tra atomic e nonatomic?

Grazie


3
Siamo spiacenti, ho dimenticato di specificare che si trova in Objective-c (cacao)

Si prega di leggere anche questo link - stackoverflow.com/questions/588866/...
Vijayendra

Per chiunque legga questo, per il 2014 è importante rendersi conto che molte di queste informazioni sono estremamente obsolete. In una parola, non c'è motivo di usare non anatomico ed è sostanzialmente sbagliato usarlo mai, per qualsiasi motivo. è storia antica. Nonatomico significa "discussione modalità non sicura" ed è (in una parola) ora totalmente irrilevante. Alcuni commenti qui stackoverflow.com/q/23977765/294884
Fattie

Non sarei d'accordo con l'affermazione "non pertinente". Se il valore cambia Raramente e come esempio nel documento Apple è il cognome. Cambia una volta, quindi l'utilizzo di un suggerimento atomico è uno spreco di risorse coinvolte poiché i controlli non sono necessari.
Nick Turner,

Risposte:


268

Dai un'occhiata a Apple Docs .

Fondamentalmente, se dici nonatomic, e generi gli accessor usando @synthesize, quindi se più thread provano a cambiare / leggere la proprietà contemporaneamente, può succedere un male. È possibile ottenere valori scritti parzialmente o oggetti sovrastampati / mantenuti, che possono facilmente causare arresti anomali. (Questo è potenzialmente molto più veloce di un accessorio atomico, però.)

Se si utilizza l'impostazione predefinita (ovvero atomic; non esisteva una parola chiave per questo, ma ora esiste ), i @synthesizemetodi d utilizzano un blocco a livello di oggetto per garantire che più letture / scritture su una singola proprietà siano serializzate. Come sottolineato dai documenti Apple, ciò non significa che l'intero oggetto sia thread-safe , ma lo sono le singole proprietà read / write.

Ovviamente, se si implementano i propri accessori anziché utilizzarli @synthesize, penso che queste dichiarazioni non facciano altro che esprimere il tuo intento sul fatto che la proprietà sia implementata in modo sicuro.


7
Mi piace questa risposta - meno confusa, più semplice e più completa di quelle trovate altrove!
Papillon,

Davvero fantastico e meno confuso (+1) ma puoi dirlo perché non atomico è potenzialmente molto più veloce di un accessorio atomico?
Desideri il

2
@Wish Gli accessori non atomici possono essere più veloci perché per impedire ad altri thread di leggere / scrivere contemporaneamente, devi tenere un mutex o fare altri trucchi di basso livello che costano tempo di CPU. Se stai usando un lucchetto, puoi anche finire per bloccare altri thread, il che richiede tempo.
Jesse Rusak,

1
@Rob Potresti fare una nuova domanda a riguardo.
Jesse Rusak,

1
@Pratik Siamo spiacenti, non è corretto. La citazione che mostri dice esattamente la stessa cosa che ho fatto: che creare una proprietà atomicevita gli arresti anomali mentre accede a singole proprietà ma non garantisce che l'oggetto nel suo insieme (cioè accedendo a proprietà separate come il nome e il cognome) farà la cosa giusta.
Jesse Rusak,

46

Dopo aver letto tanti articoli e articoli StackOverflow e aver creato app demo per controllare gli attributi delle proprietà delle variabili, ho deciso di mettere insieme tutte le informazioni sugli attributi

  1. atomic // default
  2. nonatomic
  3. strong = keep // default
  4. debole = unsafe_unretained
  5. conservare
  6. assegnare // predefinito
  7. unsafe_unretained
  8. copia
  9. sola lettura
  10. readwrite // default

quindi di seguito è riportato il link dettagliato dell'articolo in cui puoi trovare tutti gli attributi sopra menzionati, che ti aiuterà sicuramente. Mille grazie a tutte le persone che danno le migliori risposte qui !!

Attributi di proprietà variabili o modificatori in iOS

  1. atomico
    • Atomic significa che solo un thread accede alla variabile (tipo statico).
    • Atomic è thread-safe.
    • Ma è lento nelle prestazioni.
    • Atomic è il comportamento predefinito.
    • Gli accessi atomici in un ambiente non garbage collection (ovvero quando si utilizza la conservazione / rilascio / rilascio automatico) utilizzeranno un blocco per garantire che un altro thread non interferisca con la corretta impostazione / acquisizione del valore.
    • in realtà non è una parola chiave.

Esempio :

@property (retain) NSString *name;

@synthesize name;
  1. nonatomic
    • Nonatomico significa che più thread accedono alla variabile (tipo dinamico).
    • Nonatomic è thread non sicuro.
    • Ma è veloce nelle prestazioni.
    • Nonatomic NON è un comportamento predefinito; dobbiamo aggiungere una parola chiave non anatomica nell'attributo proprietà.
    • può comportare un comportamento imprevisto, quando due diversi processi (thread) accedono alla stessa variabile contemporaneamente.

Esempio:

@property (nonatomic, retain) NSString *name;

@synthesize name;

12

Oltre a quanto già detto sulla sicurezza dei thread, le proprietà non atomiche sono più veloci degli accessori atomici. Di solito non devi preoccuparti, ma tienilo a mente. Le proprietà generate dai dati core sono parzialmente non anatomiche per questo motivo.


9

In un programma multi-thread, un'operazione atomica non può essere parzialmente interrotta, mentre operazioni non anatomiche possono farlo.

Pertanto, dovresti usare i mutex (o qualcosa del genere) se hai un'operazione critica non anatomica che non vuoi interrompere.


8

Se si specifica "atomico", le funzioni di accesso generate hanno del codice aggiuntivo per proteggersi dagli aggiornamenti simultanei.


6

Di solito atomico significa che le scritture / letture sulla proprietà avvengono come un'unica operazione. Atomic_operation


2

È possibile ottenere una gestione di questo materiale leggendo l'articolo di seguito.

Threading Spiegato con lo scopo del nonatomico

non anatomico - Non thread-safe

atomic - Thread Safe - Questo è l'attributo della proprietà predefinita.


1
Sei sicuro che non sia il contrario? Le proprietà atomiche sono sicure ma le proprietà non anatomiche non sono sicure. L'ultima volta che ho controllato è stato così: P
David Rönnqvist,

0

I "Atomic” significa che l'accesso alla proprietà è thread-safe. Mentre il 'nonatomic' è l'opposto di esso. Quando si dichiara una proprietà in Objective-C la proprietà sono atomiche di default in modo che le funzioni di accesso sintetizzati forniscono l'accesso affidabile alla proprietà in un ambiente multithread, ovvero il valore restituito dal getter o impostato tramite il setter viene sempre completamente recuperato o impostato indipendentemente da quali altri thread sono in esecuzione contemporaneamente. Ma se si dichiara la proprietà come non anatomica come di seguito

@property (nonatomic, retain)  NSString *myString;

allora significa che un accessorio sintetizzato per una proprietà dell'oggetto restituisce semplicemente il valore direttamente. L'effetto dell'attributo nonatomico dipende dall'ambiente. Per impostazione predefinita, gli accessori sintetizzati sono atomici. Quindi il nonatomico è considerevolmente più veloce dell'atomico.


-2

Uno è per multi thread. Uno non lo è


IMHO: per ottenere voti positivi, devi essere più specifico e dedicare un po 'di tempo a scrivere la tua risposta.
Johan Karlsson,
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.