Mai mult
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?
1823
26
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:
În acest caz, Un fir-ar fi redenumirea obiectului de asteptare
setFirstName:
și apoi de asteptaresetLastName:
. Î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.
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ă.
Acum, atomic varianta este un pic mai complicat:
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.
Atomice
Non-Atomice
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.
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.
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 unNSString
getter în necontestate cazuri (valori în secunde):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.
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.
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:
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.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ă:
atomic
// Defaultnonatomic
slab = unsafe_unretained
rețin
unsafe_unretained
readonly
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.
atomic
atomic
înseamnă doar un singur fir accesa variabila (de tip static).atomic
este thread-safe.atomic
este comportamentul implicitExemplu:
@proprietate (reține) NSString *nume;
@sintetiza nume;
nonatomic
nonatomic
înseamnă mai multe thread accesa variabila (tip dinamic).nonatomic
este thread-nesigur.nonatomic
NU este comportamentul implicit. Avem nevoie pentru a adăuganonatomic
cuvinte cheie în proprietate atribut.Exemplu:
@proprietate (nonatomic, reține) NSString *nume;
@sintetiza nume;
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.
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.
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.
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.
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 :
este thread-safe.
NU este thread-safe.
Nu există nici un astfel de cuvinte cheie "atomic"
Putem folosi cele de mai sus ca
Vezi Stack Overflow întrebare https://stackoverflow.com/questions/8036604.
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:
Așa că ultimele două sunt la fel:
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.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!
Vezi mai multe aici: https://realm.io/news/tmi-objective-c-property-attributes/
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.
Î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 ÎNTOTDEAUNACe?! 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
Î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.
Cum să declare:
Ca atomică este implicit, deci,
ȘI în punerea în aplicare fișier
Să presupunem că o sarcină în legătură cu cele trei proprietăți sunt
Toate proprietățile de lucru în paralel (ca asincron).
Dacă te sun "nume" din fir O,
Și
În același timp, dacă te sun
din fir B,
*Acum, Dacă numele proprietatea este nonatomic** atunci
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**
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
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.
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.