Ce's diferența între atomice și nonatomic atribute?

Ce `atomic " și " nonatomic în declarații de avere?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

Ceea ce este operațional, diferența între aceste trei?

Comentarii la întrebare (1)
Soluția

Ultimele două sunt identice; "atomic" este comportamentul implicit (<grevă>rețineți că nu este de fapt un cuvânt cheie; este specificat doar de lipsa de nonatomic -- atomic a fost adăugat ca un cuvânt cheie în versiunile recente de llvm/răsune).

Presupunând că sunteți @sintetizarea metoda implementări, atomic vs. non-atomice modificări la codul generat. Dacă sunteți scris propriile setter/getters, atomic/nonatomic reține//atribuire/copie sunt doar consultativ. (Notă: @sintetiza acum este comportamentul implicit în versiunile recente de LLVM. Există, de asemenea, nu este nevoie pentru a declara variabile de instanta; acestea vor fi sintetizate în mod automat, de asemenea, și va avea un _ prefixate de numele lor pentru a preveni accidentale acces direct).

Cu "atomic", sintetizat setter/getter va asigura că o întreg valoarea este întotdeauna s-a întors din getter sau stabilite de setter, indiferent de setter activitate pe orice alt thread. Asta este, dacă Un fir este în mijlocul getter în timp ce firul B solicită setter, un real viabile valoare ... o autoreleased obiect, cel mai probabil, va fi returnat apelantului în A.

În nonatomic, nici o astfel de garanții. Astfel, nonatomic este considerabil mai repede decât "atomic".

Ce "atomic" nu nu nu se face nici o garanție cu privire fir de siguranță. Dacă Un fir este de asteptare getter simultan cu fir B și C de asteptare setter cu valori diferite, fir O poate primi nici una din cele trei valori returnate-o înainte de orice organisme de a fi numit sau oricare dintre valorile trecut în setteri în B și C. de Asemenea, obiectul poate termina cu valoarea din B sau C, nici o modalitate de a spune.

Asigurarea integrității datelor -- una dintre principalele provocări multi-threaded de programare-se realizează prin alte mijloace.

Adăugând la asta:

atomicitate de un singur asemenea, proprietatea nu poate garanta siguranța fir atunci când mai multe dependente de proprietățile sunt în joc.

Ia în considerare:

 @property(atomic, copy) NSString *firstName;
 @property(atomic, copy) NSString *lastName;
 @property(readonly, atomic, copy) NSString *fullName;

În acest caz, Un fir-ar fi redenumirea obiectului de asteptare setFirstName: și apoi de asteptare setLastName:. Între timp, firul B poate suna fullName între ață de O's două apeluri și va primi noul prenume împreună cu vechiul nume.

Pentru a aborda acest lucru, aveți nevoie de un tranzacționale model. I. e. un alt tip de sincronizare și/sau de excludere, care permite o pentru a exclude accesul la fullName` în timp ce proprietățile dependente sunt în curs de actualizare.

Comentarii (21)

Acest lucru este explicat în Apple's documentația, dar mai jos sunt câteva exemple de ceea ce se întâmplă de fapt.

<grevă>Rețineți că nu există nici o "atomic" cuvinte cheie, dacă nu specificați "nonatomic", atunci proprietatea este atomice, dar specificând "atomic" în mod explicit va rezulta într-o eroare.

Dacă nu specificați "nonatomic", atunci proprietatea este atomice, dar puteți specifica în continuare "atomic" în mod explicit în versiunile recente, dacă doriți să.

//@property(nonatomic, retain) UITextField *userName;
//Generates roughly

- (UITextField *) userName {
    return userName;
}

- (void) setUserName:(UITextField *)userName_ {
    [userName_ retain];
    [userName release];
    userName = userName_;
}

Acum, atomic varianta este un pic mai complicat:

//@property(retain) UITextField *userName;
//Generates roughly

- (UITextField *) userName {
    UITextField *retval = nil;
    @synchronized(self) {
        retval = [[userName retain] autorelease];
    }
    return retval;
}

- (void) setUserName:(UITextField *)userName_ {
    @synchronized(self) {
      [userName_ retain];
      [userName release];
      userName = userName_;
    }
}

Practic, atomic versiune are să ia un sistem de blocare pentru a garanta siguranța fir, și, de asemenea, este de a lovi arbitrul conta pe obiect (și autorelease conta la echilibru), astfel încât obiectul este garantat de a exista pentru apelant, în caz contrar, există un potențial condiție cursă dacă un alt fir este stabilirea valorii, provocând ref conta să scadă la 0.

Există de fapt un număr mare de variante diferite de cum funcționează aceste lucruri în funcție de proprietățile sunt valori scalare sau obiecte, și cum să păstreze, copia, readonly, nonatomic, etc interacționa. În general, proprietatea sintetizatoare știu doar cum să facă "corect" pentru toate combinațiile.

Comentarii (7)

Atomice

  • este comportamentul implicit
  • se va asigura în prezent procesul este finalizat de către CPU, înainte de un alt proces accesează variabila
  • nu este rapid, deoarece asigură procesul este finalizat în întregime

Non-Atomice

  • NU este comportamentul implicit
  • mai repede (pentru sintetizat cod, care este, pentru variabilele create folosind @proprietate și @sintetiza)
  • nu este thread-safe
  • poate duce la un comportament neașteptat, când doi proces diferit de acces la aceeași variabilă, în același timp
Comentarii (0)

Cel mai bun mod de a înțelege diferența este folosind următorul exemplu.

Să presupunem că există o atomice șir de proprietate numit "nume", și dacă te sun [auto setName:@"O"] de Un fir, sun [auto setName:@"B"] de fir B, și sun [auto numele] de fir C, atunci toate operațiunile de pe fire diferite vor fi efectuate în serie, ceea ce înseamnă că dacă un fir se execută un setter sau getter, apoi alte fire va aștepta.

Acest lucru face de proprietate "nume" citi/scrie în condiții de siguranță, dar dacă un alt fir, D, apeluri [numele eliberarea] simultan atunci această operațiune s-ar putea produce un accident, deoarece nu există nici setter/getter apel implicate aici. Ceea ce înseamnă că un obiect este de a citi/scrie în condiții de siguranță (ATOMIC), dar nu sunt thread-safe ca un alt fire pot trimite simultan orice tip de mesaje la obiect. Dezvoltatorul ar trebui să se asigure fir de siguranță pentru astfel de obiecte.

Dacă proprietatea "nume" a fost nonatomic, apoi toate firele din exemplul de mai sus - a,B, C și D vor executa simultan produce nici un rezultat imprevizibil. În caz de atomic, nici unul dintre a, B sau C se va executa în primul rând, dar încă mai pot executa în paralel.

Comentarii (0)

Sintaxa și semantica sunt deja bine definite prin alte excelentă răspunsuri la această întrebare. Pentru că executie și performanță nu sunt detaliate, bine, I se va adăuga răspunsul meu.

ceea Ce este o diferență funcțională între aceste 3?

Am'd considerat întotdeauna atomic un mod destul de curios. La nivel de abstractizare lucrăm la, folosind proprietăți atomice pentru o clasa ca un vehicul pentru a atinge 100% fir de siguranță-este un caz colț. Pentru că, cu adevărat corectă multithreaded programe de intervenție de către programator este aproape sigur o cerință. Între timp, caracteristici de performanță și de execuție au nu totuși fost detaliate în profunzime. Am scris un puternic multithreaded programe de-a lungul anilor, am fost declararea mea proprietăți ca nonatomic tot timpul pentru că atomică nu a fost sensibil pentru orice scop. În timpul discuției de detalii atomice și nonatomic proprietăți această întrebare, am făcut un profil întâmpinat unele curios de rezultate.

Executie

Ok. Primul lucru pe care aș dori să clarific este că de blocare de aplicare este punerea în aplicare definite și abstracte. Louis foloseste @sincronizată(auto) în exemplu. am văzut acest lucru ca pe o sursă comună de confuzie. Punerea în aplicare nu de fapt utilizarea @sincronizată(auto); se folosește la nivel de obiect încuietori de spin. Louis's ilustrație este bun pentru un nivel înalt ilustrare folosind constructe toți suntem familiarizați cu, dar's important să știi că nu folosesc@sincronizată(auto)`.

O altă diferență este că proprietăți atomice va păstra/ciclu de eliberare obiectele în getter.

Performanță

Aici's partea interesantă: de Performanță, folosind atomice proprietate accesează în necontestate (de exemplu, un singur fir) cazuri poate fi într-adevăr foarte rapid în unele cazuri. În mai puțin de ideal cazuri, utilizarea atomice accesează poate costa mai mult de 20 de ori aeriene din nonatomic`. În timp ce în Litigiu caz, folosind 7 fire a fost de 44 de ori mai lent pentru trei octeți struct (2.2 GHz Core i7 Quad Core, x86_64). Cele trei octeți struct este un exemplu de o foarte lent proprietate.

Ca o notă interesantă: definite de Utilizator evaluatorilor din trei octeți struct au fost de 52 de ori mai repede decât sintetizat atomice evaluatorilor; sau 84% viteza de sintetizat nonatomic evaluatorilor.

Obiectele în litigiu cazuri pot, de asemenea, depășește de 50 de ori.

Datorită numărului mare de optimizări și variații în implementări, l's destul de dificil să se măsoare lumea reală impact în aceste contexte. S-ar putea auzi de multe ori ceva de genul "ai Încredere în ea, dacă nu de profil și pentru a găsi că este o problemă". Din cauza la nivel de abstractizare, l's, de fapt, destul de dificil de a măsura impactul real. Spicuire costurile reale de profile poate fi foarte consumatoare de timp, și datorită captărilor, destul de inexacte. La fel de bine, ARC vs MRC poate face o mare diferenta.

Deci sa's pas înapoi, nu concentrându-se pe punerea în aplicare de proprietate accesează, am'll includ de obicei suspecți ca objc_msgSend, și de a examina unele din lumea reală rezultate la nivel înalt pentru multe apeluri de la un NSString getter în necontestate cazuri (valori în secunde):

  • MRC | nonatomic | manual implementat getters: 2
  • MRC | nonatomic | sintetizat getter: 7
  • MRC | atomic | sintetizat getter: 47
  • ARC | nonatomic | sintetizat getter: 38 (notă: ARC's adăugând ref conta ciclism aici)
  • ARC | atomic | sintetizat getter: 47

După cum ați ghicit, probabil, numărul de referință activitatea/bicicleta este un important contributor cu atomics și sub ARC. Te-ar vedea, de asemenea, mari diferențe în cazurile contestate.

Deși am să acorde o atenție aproape de performanta, eu încă mai spun Semantica Primul!. Între timp, de performanță este o prioritate pentru multe proiecte. Cu toate acestea, cunoașterea detaliilor de execuție și a costurilor de tehnologii utilizați cu siguranță nu't rănit. Ar trebui să utilizați tehnologia potrivita pentru nevoile tale, scopuri, și abilități. Sperăm că acest lucru vă va salva de câteva ore de comparații, și a vă ajuta să face o decizie mai bine informați atunci când proiectarea de programe.

Comentarii (6)

Atomic = fir de siguranță

Non-atomice = Nici un fir de siguranță

Firul de siguranță:

Variabilele de instanta sunt thread-safe dacă se comportă în mod corect atunci când este accesat din mai multe fire, indiferent de programarea sau intercalarea de execuție din aceste fire de execuție mediu, și cu nici o suplimentare de sincronizare sau alte coordonare pe partea de codul de asteptare.

În contextul nostru:

Dacă un fir schimbă valoarea de exemplu a schimbat valoarea este disponibil pentru toate firele, și doar un singur fir poate schimba valoarea la un moment dat.

În cazul în care pentru a utiliza atomic:

dacă de exemplu, variabila va fi accesate într-un mediu multithreaded.

Implicarea atomic:

Nu la fel de repede ca nonatomic", deoarece " nonatomic nu't nevoie de nici watchdog lucru pe care de execuție .

În cazul în care pentru a utiliza nonatomic:

Dacă de exemplu, variabila nu va fi schimbat de mai multe fire puteți să-l utilizați. Acesta îmbunătățește performanța.

Comentarii (2)

Am găsit-o destul de bine pus explicație atomice și non-proprietăți atomice aici. Aici's un text relevant din aceeași:

'atomic' înseamnă că nu pot fi defalcate. În sistemul de OPERARE/programare termeni atomic apel de funcție este una care nu poate fi întrerupt - întreaga funcției trebuie să fie executat, și nu a schimbat PROCESORULUI de OS's de obicei context de comutare până it's complete. Doar în cazul în care nu't știu: de la CPU poate face doar un singur lucru la un moment dat, sistemul de OPERARE se rotește acces la CPU pentru toate procesele care rulează în puțin timp-felii, pentru a da iluzii de multitasking. CPU scheduler poate (și) întrerupe un proces în orice moment în executarea acesteia - chiar și în mijlocul apel de funcție. Deci, pentru acțiunile, cum ar fi actualizarea comună contra variabile în cazul în care două procese ar putea încerca să actualizeze variabilă, în același timp, acestea trebuie să fie executat 'atomic', de exemplu, fiecare acțiune de actualizare a pentru a termina în întregime înainte de orice alt proces poate fi schimbat pe CPU.

Deci am'd fi ghicitul că atomice în acest caz, înseamnă atributul cititor de metode nu poate fi întreruptă - în vigoare în sensul că variabila(s) fiind citit prin metoda nu poate schimba valoarea lor la jumătate pentru că un fir de alte//apel funcția devine schimbat pe CPU.

Pentru că atomic variabile nu poate fi întreruptă, valoarea conținută de acestea, la orice punct este (thread-lock) garantat de a fi necorupt, deși, asigurându-se acest thread lock face ca accesul la ele mai lent. non-atomic variabile, pe de altă parte, nu fac nici o astfel de garanție, dar nu oferă luxul de acces mai rapid. Pentru a rezuma, du-te cu non-atomic` atunci când știi variabile câștigat't fi accesate prin mai multe fire simultan și de a accelera lucrurile.

Comentarii (1)

După ce a citit atât de multe articole, Stiva Preaplin de posturi și de a face demo de aplicații pentru a verifica variabilă de proprietate atributele, am decis să pun toate atributele informații împreună:

  1. atomic // Default
  2. nonatomic
  3. puternic = păstreze` // Default
  4. slab = unsafe_unretained
  5. rețin
  6. atribuie // Default
  7. unsafe_unretained
  8. "copie"
  9. readonly
  10. readwrite // Default

În articolul Variabile de proprietate atributele sau modificatori în iOS puteți găsi toate cele mai sus-menționate, atribute, și care va ajuta cu siguranta.

  1. atomic
  • atomic înseamnă doar un singur fir accesa variabila (de tip static).
  • atomic este thread-safe.
  • Dar este lent de performanță
  • atomic este comportamentul implicit
  • Atomic evaluatorilor într-un non gunoi colectate de mediu (de exemplu, atunci când se utilizează reține/eliberare/autorelease) va folosi un sistem de blocare pentru a se asigura că un alt fir nu't interfera cu setarea corectă/obtinerea de valoare.
  • Nu este de fapt un cuvânt cheie.

Exemplu:

@proprietate (reține) NSString *nume;

@sintetiza nume;

  1. nonatomic
  • nonatomic înseamnă mai multe thread accesa variabila (tip dinamic).
  • nonatomic este thread-nesigur.
  • Dar este rapid în performanță
  • nonatomic NU este comportamentul implicit. Avem nevoie pentru a adăuga nonatomic cuvinte cheie în proprietate atribut.
  • Aceasta poate duce la un comportament neașteptat, când doi proces diferit (fire) de acces aceeași variabilă, în același timp.

Exemplu:

@proprietate (nonatomic, reține) NSString *nume;

@sintetiza nume;

Comentarii (2)

Atomica :

Atomic garantează că accesul la proprietate vor fi efectuate într-un atomice mod. E. g. se întoarce întotdeauna un complet inițializat obiecte, orice get/set de o proprietate pe un singur fir trebuie să completeze înainte de un alt acces la ea.

Dacă vă imaginați următoarea funcție care apar pe două fire la o dată, puteți vedea de ce rezultatele nu ar fi destul.

-(void) setName:(NSString*)string
{
  if (name)
  {
    [name release]; 
    // what happens if the second thread jumps in now !?
    // name may be deleted, but our 'name' variable is still set!
    name = nil;
  }

  ...
}

Pro : Întoarcerea complet inițializat obiecte de fiecare dată o face mai buna alegere in caz de multi-threading.

Contra : Hit de performanță, face executarea un pic mai lent

Non-Atomice :

Spre deosebire Atomice, nu't se asigure pe deplin inițializează obiectul reveni de fiecare dată.

Pro : Extrem de rapid de executie.

Contra : Șansele de gunoi valoare în caz de multi-threading.

Comentarii (1)

Cel mai simplu raspuns primul: Nu's nici o diferență între două exemple. În mod implicit, proprietatea evaluatorilor sunt atomice.

Atomic evaluatorilor într-un non gunoi colectate de mediu (de exemplu, atunci când se utilizează reține/eliberare/autorelease) va folosi un sistem de blocare pentru a se asigura că un alt fir nu't interfera cu setarea corectă/obtinerea de valoare.

Vezi "Performanță și Filetare" secțiune de Mere's Objective-C 2.0 documentația pentru mai multe informații și pentru alte considerente atunci când crearea de multi-threaded aplicații.

Comentarii (2)

Atomic înseamnă doar un singur fir accesează variabila (de tip static). Atomic este thread-safe, dar este lent.

Nonatomic înseamnă mai multe fire accesa variabila (tip dinamic). Nonatomic este thread-nesigur, dar este rapid.

Comentarii (0)

Atomic este thread-safe, e lent și bine-asigură (nu garantat) care doar blocat valoare este asigurat indiferent de cât de multe fire sunt încercarea de acces în aceeași zonă. Atunci când se utilizează atomice, o bucată de cod scrise în interiorul această funcție devine parte din secțiunea critică, la care doar un singur fir poate executa la un moment dat.

Ea asigură doar firul de siguranță; aceasta nu garantează că. Ce vreau să spun este că ai angajat un expert driver pentru tine masina, inca nu't garanții masina a castigat't întâlni un accident. Cu toate acestea, probabilitatea rămâne cea mai mică.

Atomic - se poate't fi rupt în jos, astfel încât rezultatul este de așteptat. Cu nonatomic - atunci când un alt fir accesa zona de memorie se poate modifica, astfel încât rezultatul este neașteptat.

Cod Vorbi :

Atomic face getter și setter de proprietate thread-safe. de exemplu, dacă u au scris :

self.myProperty = value;

este thread-safe.

[myArray addObject:@"Abc"] 

NU este thread-safe.

Comentarii (1)

Nu există nici un astfel de cuvinte cheie "atomic"

@property(atomic, retain) UITextField *userName;

Putem folosi cele de mai sus ca

@property(retain) UITextField *userName;

Vezi Stack Overflow întrebare https://stackoverflow.com/questions/8036604.

Comentarii (3)

La implicit este atomic, acest lucru înseamnă că nu te-a costat performanță ori de câte ori utilizați proprietatea, dar acesta este thread-safe. Ce Objective-C nu, este stabilit un sistem de blocare, astfel încât doar real fir poate accesa variabila, atâta timp cât setter/getter este executat.

Exemplu cu MRC de o proprietate cu o ivar _internal:

[_internal lock]; //lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

Așa că ultimele două sunt la fel:

@property(atomic, retain) UITextField *userName;

@property(retain) UITextField *userName; // defaults to atomic

Pe de altă parte nu nonatomic nu adaugă nimic la cod. Deci, este doar firul de siguranță, dacă ai codul de securitate mecanism de tine.

@property(nonatomic, retain) UITextField *userName;

Cuvinte cheie nu't trebuie să fie scris ca prima proprietate atribut la toate.

Don't uita, asta nu't înseamnă că proprietatea ca un întreg este thread-safe. Doar apel de metodă de setter/getter este. Dar, dacă folosiți un setter și după aceea un getter în același timp cu 2 fire diferite, ar putea fi rupt prea!

Comentarii (1)

atomică (default)

Atomică este implicit: dacă nu tastați nimic, nu este proprietatea ta atomică. O atomice de proprietate este garantat că, dacă ai încerca să citească de la acesta, veți primi înapoi o valoare validă. Ea nu face nici o garanție despre ce valoare ar putea fi, dar va primi înapoi de date bune, nu doar gunoi de memorie. Ce acest lucru vă permite să faceți dacă aveți mai multe fire sau mai multe procese îndreptate spre o singură variabilă, unul fir poate citi și un alt thread poate scrie. Dacă au lovit în același timp, cititorul fir este garantat pentru a obține unul dintre cele două valori: fie înainte de schimbarea sau după schimbare. Ce atomice nu da este nici un fel de garanție cu privire la care dintre aceste valori ai s-ar putea obține. Atomic este foarte frecvent confundată cu a fi thread-safe, și că nu este corect. Ai nevoie pentru a-ți garanta siguranța fir alte moduri. Cu toate acestea, atomic va garanta că, dacă încerci să citești, te întorci un fel de valoare.

nonatomic

Pe de alta parte, non-atomice, după cum puteți ghici, probabil, înseamnă, "nu face asta atomice lucrurile." Ceea ce pierzi este garanția că obține întotdeauna înapoi ceva. Dacă încercați să citiți în mijlocul unei scrie, te-ai putea întoarce date de gunoi. Dar, pe de altă parte, du-te un pic mai repede. Pentru proprietăți atomice trebuie să faci ceva magic pentru a garanta că veți primi înapoi o valoare, ele sunt un pic mai lent. Dacă este o proprietate pe care se accesează o mulțime, poate doriți să renunțe pentru a nonatomic să asigurați-vă că nu suporta viteza asta pedeapsa.

Vezi mai multe aici: https://realm.io/news/tmi-objective-c-property-attributes/

Comentarii (0)

Dacă utilizați dvs. de proprietate în multi-threaded cod, atunci v-ar fi capabil de a vedea diferența dintre nonatomic și atribute atomice. Nonatomic este mai rapid decât atomice și atomic este thread-safe, nu nonatomic.

Vijayendra Tripathi și-a dat deja un exemplu pentru un multi-threaded mediu.

Comentarii (0)

Înainte de a începe: trebuie să știți că fiecare obiect în memorie trebuie să fie dezafectat din memorie pentru un nou scriitor să se întâmple. Puteți't pur și simplu scrie pe partea de sus a ceva ca pe hârtie. Ai trebuie șterge mai întâi (dealloc) și apoi puteți scrie pe ea. Dacă în momentul în care ștergerea se face (sau a face pe jumătate) și nimic nu a înca a fost scris (sau jumătate de scris) și încercați să-l citească ar putea fi foarte problematică! Atomice și nonatomic ajuta să trata această problemă în diferite moduri.

Citiți acest întrebare și apoi citiți Bbum's a răspunde. În plus, atunci citiți rezumatul meu.


atomic va garanta ÎNTOTDEAUNA

  • Dacă două persoane diferite doresc să scrie și să citească în același timp, lucrarea ta a câștigat't doar arde! --> cererea Dumneavoastră nu va fi niciodată accident, chiar și într-o condiție de rulare.
  • Dacă o persoană este încercarea de a scrie și a scris doar 4 din 8 litere pentru a scrie, atunci nu puteți citi în mijloc, citirea se poate face numai atunci când toate cele 8 litere este scris --> Nu citi(ia) se va întâmpla pe 'un fir care este încă scris', de exemplu dacă sunt 8 bytes de octeți pentru a fi scris, și doar 4 octeți sunt scrise-până la acel moment, nu ai voie să citesc din ea. Dar când am spus că a câștigat't accident atunci ar citi din valoarea unui autoreleased obiect.
  • Dacă înainte scris au șters ceea ce a fost scris anterior pe hârtie și apoi cineva vrea să-ți citesc poate citi în continuare. Cum? Va citesc de ceva similar cu Mac OS Gunoi ( ca Gunoi nu este încă 100% șterse...l's într-o uitare) ---> Dacă ThreadA este de a citi în timp ce ThreadB are deja dezafectat de a scrie, s-ar obține o valoare de finală pe deplin scrise valoare de ThreadB sau pentru a obține ceva de la autorelease piscină.

Păstrează contează sunt modul în care memoria este gestionat în Objective-C. atunci Când creați un obiect, are o păstreze număr de 1. Atunci când trimite un obiect o retine mesajul, își păstrează este incrementat cu 1. Când trimiteți un obiect, un mesaj de eliberare, își păstreze numărul este decrementat de 1. Atunci când trimiteți un obiect o autorelease mesaj, sa-și păstreze conta este decrementat cu 1 la un moment dat în viitor. Dacă o object's reține numărul este redus la 0, este dezafectat.

  • Atomic nu - 't garanție fir de siguranță, deși l's util pentru realizarea fir de siguranță. Firul de Siguranță este relativ la cum scrii codul/ care thread queue sunteți de lectură/scriere. Ea doar garantează non-pot fi lovite multithreading.

Ce?! Sunt multithreading și fir de siguranță diferite?

Da. Multithreading înseamnă: mai multe fire pot citi o comună bucată de date în același timp și ne-am nu se va prăbuși, dar nu't de garantare care le sunt't citirea de la un non-autoreleased valoare. Cu fir de siguranță, l's a garantat că ceea ce ai citit nu este auto-a lansat. Motivul pentru care noi nu't face totul atomice în mod implicit este, că există un cost de performanță și pentru cele mai multe lucruri nu't într-adevăr nevoie de fir de siguranță. Câteva piese de codul nostru nevoie de ea și pentru cele câteva piese, avem nevoie pentru a scrie codul nostru într-un thread-safe mod, folosind încuietori, mutex sau de sincronizare.


nonatomic

  • Deoarece nu există nici un astfel de lucru ca Mac OS Gunoi, atunci nimeni nu îi pasă dacă este sau nu veți obține întotdeauna o valoare (<-- Acest lucru ar putea duce la un accident), nici nu-i pasă cuiva dacă cineva încearcă să citească la jumătatea scris (deși jumătate de scriere în memorie este foarte diferit de la jumătatea scris pe hârtie, pe de memorie ar putea oferi un nebun prost valoare de mai înainte, în timp ce pe hârtie, veți vedea numai jumătate din ceea ce's a fost scris) --> Nu't de garantare să nu accident, pentru că nu't folosi autorelease mecanism.
  • Nu't garanție completă scrisă de valori pentru a fi citit!
  • Este mai rapid decât atomice

În general ele sunt diferite în 2 aspecte:

  • Crashing sau nu pentru a avea sau a nu avea o autorelease piscină.

  • Permiterea de a fi citit chiar în mijlocul de o 'nu a terminat de scris sau valoare gol' sau nu permițându-și doar permițând pentru a citi atunci când valoarea este complet scris.

Comentarii (0)
  • -Atomic înseamnă doar un singur fir accesa variabila(de tip static).
  • -Atomic este thread-safe.
  • -dar este lent de performanță

Cum să declare:

Ca atomică este implicit, deci,

@property (retain) NSString *name;

ȘI în punerea în aplicare fișier

self.name = @"sourov";

Să presupunem că o sarcină în legătură cu cele trei proprietăți sunt

 @property (retain) NSString *name;
 @property (retain) NSString *A;
 @property (retain) NSString *B;
 self.name = @"sourov";

Toate proprietățile de lucru în paralel (ca asincron).

Dacă te sun "nume" din fir O,

Și

În același timp, dacă te sun

[self setName:@"Datta"]

din fir B,

*Acum, Dacă numele proprietatea este nonatomic** atunci

  • Se va întoarce valoarea "Datta" pentru O
  • Se va întoarce valoarea "Datta" pentru B

De aceea non atomic se numește fir de nesigur, dar, Dar este rapid în performanță, deoarece de execuție în paralel

*Acum, Dacă numele proprietatea este atomice**

  • Se va asigura valoarea "Sourov" pentru O
  • Atunci Se va returna valoarea "Datta" pentru B

Asta's de ce atomic se numește fir de Siguranță și Asta's de ce este numit de citire-scriere în condiții de siguranță

O astfel de situație, operațiunea se va efectua în serie. Și Lent de performanță

- Nonatomic înseamnă mai multe thread accesa variabila(tip dinamic).

- Nonatomic este firul nesigur.

- dar este rapid în performanță

-Nonatomic NU este comportamentul implicit, avem nevoie pentru a adăuga nonatomic cuvinte cheie în proprietate atribut.

În Swift Confirmând faptul că Swift proprietăți sunt nonatomic în ObjC sens. Unul dintre motive este deci te gândești dacă per-proprietatea de atomicitate este suficient pentru nevoile dumneavoastra.

Referință: https://forums.developer.apple.com/thread/25642

Încolo mai multe informații vă rugăm să vizitați site-ul http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html

Comentarii (1)

Atomic proprietatea asigură să-și păstreze un complet inițializează valoarea, indiferent de cât de multe fire fac getter & setter pe ea.

La nonatomic proprietate specifică faptul că sintetizat evaluatorilor pur și simplu setați sau să se întoarcă o valoare direct, cu nici o garanție cu privire la ceea ce se întâmplă în cazul în care aceeași valoare este accesată simultan de fire diferite.

Comentarii (0)

Atomic înseamnă doar un singur fir poate accesa variabila de la un timp (de tip static). Atomic este thread-safe, dar este lent.

Nonatomic înseamnă mai multe fire pot accesa variabila în același timp (dinamice de tip). Nonatomic este thread-nesigur, dar este rapid.

Comentarii (0)