Cosa significa "nonatomico" in questo codice?
@property(nonatomic, retain) UITextField *theUsersName;
Qual'è la differenza tra atomic e nonatomic?
Grazie
Cosa significa "nonatomico" in questo codice?
@property(nonatomic, retain) UITextField *theUsersName;
Qual'è la differenza tra atomic e nonatomic?
Grazie
Risposte:
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 @synthesize
metodi 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.
atomic
evita 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.
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
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 !!
Esempio :
@property (retain) NSString *name;
@synthesize name;
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.
Se si specifica "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
È 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.
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.
Uno è per multi thread. Uno non lo è