Domanda

Cosa significa "non anatomico" intendi in questo codice?

@property(nonatomic, retain) UITextField *theUsersName;

Qual è la differenza tra atomico e non anatomico?

Grazie

È stato utile?

Soluzione

Dai un'occhiata ai Apple Docs .

Fondamentalmente, se dici nonatomic e generi gli accessor usando @synthesize , allora 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 usi il valore predefinito (che è atomic ; non esisteva una parola chiave per questo, ma è ora ), quindi i metodi @synthesize utilizzano un blocco a livello di oggetto per garantire che più letture / scritture a una singola proprietà sono serializzati. Come sottolineato dai documenti Apple, questo non significa che l'intero oggetto sia thread-safe , ma le singole proprietà in lettura / scrittura lo sono.

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

Altri suggerimenti

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. atomico // predefinito
  2. nonatomic
  3. strong = retain // default
  4. debole = non sicuro_unretained
  5. mantenere
  6. assegnare // predefinito
  7. unsafe_unretained
  8. copia
  9. in 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 o modificatori di proprietà variabili in iOS

  1. atomica
    • 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) useranno 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 comportamenti imprevisti, quando due processi (thread) diversi accedono alla stessa variabile contemporaneamente.

Esempio:

@property (nonatomic, retain) NSString *name;

@synthesize name;

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.

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

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

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

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

Puoi ottenere una gestione di questo materiale leggendo l'articolo qui sotto.

Discussione Spiegata con lo scopo del nonatomico

nonatomico - Non thread-safe

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

" atomic & # 8221; 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à è atomica per impostazione predefinita in modo che gli accessori sintetizzati forniscano un accesso affidabile alla proprietà in un ambiente multithread & # 8212; ovvero, il valore restituito dal getter o impostato tramite il setter viene sempre completamente recuperato o impostato indipendentemente dagli altri thread in esecuzione contemporaneamente. Ma se dichiari la proprietà non anatomica come sotto

@property (nonatomic, retain)  NSString *myString;

quindi 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.

Uno è per multi thread. Uno non è

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top