Jaký je rozdíl mezi atomovými a nonatomic atributů?

hlasů
1k

Co atomica nonatomicznamená v prohlášení o vlastnictví?

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

Jaký je funkční rozdíl mezi těmito třemi?

Položena 26/02/2009 v 03:31
zdroj uživatelem
V jiných jazycích...                            


27 odpovědí

hlasů
1k

Poslední dva jsou shodné; „atomové“ je výchozí chování ( Všimněte si, že to není vlastně klíčové slovo, je uvedeno pouze nepřítomnostínonatomic - atomicbyl přidán jako klíčové slovo v posledních verzích LLVM / Clang).

Za předpokladu, že jste @synthesizing implementací metody, atomová vs. non-atomových změn vygenerovaný kód. Pokud píšete své vlastní nastavovací / příjemcové, atomová / nonatomic / zachovat / přiřadit / copy jsou pouze poradní. (Poznámka: @synthesize je nyní výchozí chování v posledních verzích LLVM K dispozici je také není třeba deklarovat proměnné instance, budou syntetizovány automaticky, taky, a bude mít. _Prepended jejich jména, aby se zabránilo náhodnému přímý přístup).

S „atomová“, bude syntetizovaný seřizovač / getr zajistit, aby celá hodnota je vždy vrácena z getru nebo nastavuje setra, nezávisle na vypalovací aktivity na jakékoli jiné vlákno. To znamená, že pokud vlákno A je ve středu getru zatímco vlákno B volá seřizovač, skutečný životaschopný hodnota - je autoreleased objekt, s největší pravděpodobností - bude vrácena volajícímu v A.

V nonatomicžádné takové záruky jsou dělány. Tak nonatomicje značně rychlejší než „atomové“.

Co „atomový“ dělá to udělat, je žádné záruky o bezpečnosti závitu. Pokud závit A volá getr současně se závitem B a C voláním seřizovač s různými hodnotami, závit A může se některý ze tří hodnot vrátil - ten před jakýmikoliv seřizovačů volání a to buď z hodnot předaných do tvůrci v B a C. Podobně, objekt může skončit s hodnotou od B nebo C, žádný způsob, jak zjistit.

Zajištění integrity dat - jedna z hlavních výzev vícevláknové programování - je dosáhnout jinými prostředky.

Přidání k tomu:

atomicity jediného majetku také nemůže zaručit vlákno bezpečnost při vícenásobné závislé vlastnosti jsou ve hře.

Zvážit:

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

V tomto případě, závit A mohlo být přejmenování objektu voláním setFirstName:a poté volání setLastName:. Do té doby, závit B může volat fullNamemezi závit A je dva hovory a bude přijímat nové křestní jméno ve spojení se starým příjmením.

Na tuto adresu, budete potřebovat transakční modelu . Tedy jiným druhem synchronizace a / nebo vyloučení, která umožňuje jeden vyloučit přístup k fullNamezatímco závislé vlastnosti jsou aktualizovány.

Odpovězeno 26/02/2009 v 07:40
zdroj uživatelem

hlasů
341

To je vysvětleno v Apple dokumentaci , ale nižší, než jsou některé příklady toho, co se skutečně děje. Všimněte si, že neexistuje žádná „atomový“ klíčové slovo, pokud nechcete specifikovat „nonatomic“, pak je vlastnost atomové, ale zadáním „atomový“ explicitně bude mít za následek chyby.

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

- (UITextField *) userName {
    return userName;
}

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

Nyní, že atomový varianta je trochu složitější:

//@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_;
    }
}

Zjednodušeně řečeno, atomové verze má přijmout blokování, aby byla zaručena bezpečnost vlákno, a je také narážel počet ref na objekt (i počet autorelease ji bilance) tak, že objekt je zaručeno, že existují pro volajícího, tam jinak je potenciální spor, pokud jiné vlákno je nastavení hodnoty, což je počet ref klesnout na 0 ° C.

Tam jsou vlastně velké množství různých variant, jak tyto věci fungují v závislosti na tom, zda jsou tyto vlastnosti skalární hodnoty nebo předměty, a jak se zachovat, kopírování, jen pro čtení, nonatomic atd komunikovat. Obecně lze říci, že vlastnictví syntezátory jen vědět, jak na tu „správnou věc“ pro všechny kombinace.

Odpovězeno 26/02/2009 v 07:24
zdroj uživatelem

hlasů
147

Atomový

  • je výchozí chování
  • zajistí současný proces je dokončen do CPU, než jiný proces přistupuje k proměnné
  • není rychlý, protože zajišťuje, že proces dokončen zcela

Non-Atomic

  • není výchozí chování
  • rychleji (za syntetizovaného kódu, to znamená, že k proměnné vytvořené pomocí @property a @synthesize)
  • není thread-safe
  • může vést k neočekávanému chování, když se dva jiný proces přístup ke stejné proměnné zároveň
Odpovězeno 25/05/2012 v 11:56
zdroj uživatelem

hlasů
124

Nejlepší způsob, jak pochopit rozdíl je pomocí následujícího příkladu.

Předpokládejme, že je atomový řetězec vlastnost nazývá „name“, a pokud voláte [self setName:@"A"]z závitem A, volejte [self setName:@"B"]z vlákna B a volání [self name]z nití C, pak se bude provádět všechny operace na různých nití sériově což znamená, že pokud jedno vlákno je vykonání setra nebo kariérista, pak další témata bude čekat.

To dělá vlastnost „name“ čtení / zápis v bezpečí, ale pokud jiné vlákno, D, volá [name release]současně pak tato operace mohla produkovat pád, protože neexistuje žádný seřizovač / kariérista volání zde jedná. Což znamená, že objekt je čtení / zápis trezor (atomové), ale není bezpečné podprocesu jako jiná vlákna mohou současně zaslat libovolný typ zprávy do objektu. Developer by měl zajistit nitě bezpečnost takových objektů.

Pokud byl nonatomic vlastnost „name“, pak všechna vlákna v uvedeném příkladu - A, B, C a D se bude provádět současně produkovat jakýkoliv nepředvídatelný výsledek. V případě, že atomový, a to buď jeden z A, B nebo C, se provede první, ale D může ještě provádět paralelně.

Odpovězeno 31/01/2012 v 19:36
zdroj uživatelem

hlasů
108

Syntaxe a sémantika jsou již dobře definována jinými vynikající odpovědí na tuto otázku. Vzhledem k tomu, provedení a výkonu nejsou podrobně dobře, přidám svou odpověď.

Jaký je funkční rozdíl mezi těmito 3?

Vždycky jsem považován atomické jako výchozí docela zvědavý. Na úrovni dělení pracujeme v, za použití atomové vlastnosti pro třídu jako prostředek k dosažení 100% nitě bezpečnosti je rohová případ. Pro skutečně správných programů vícevláknových, zásah programátora je téměř jistě požadavek. Mezitím, výkonnostní charakteristiky a provádění dosud nebyly podrobně do hloubky. Poté, co napsal několik těžce vícevláknových programů v průběhu let, jsem byl deklarovat své vlastnosti nonatomicpo celou dobu, protože atomové nebylo rozumné pro jakýkoliv účel. Během diskuse o podrobnostech atomové a nonatomic vlastností na tuto otázku , udělal jsem nějaké profilování vyskytly určité podivné výsledky.

Provedení

OK. První věc, kterou bych chtěl vyjasnit, je, že implementace zamykání je implementace definované a abstrahovat. Louis používá @synchronized(self)v jeho příkladu - Viděl jsem to jako společný zdroj zmatku. Realizace není ve skutečnosti používat @synchronized(self); používá úrovni objektů spin zámků . Louis ilustrace je dobré pro ilustraci na vysoké úrovni s použitím konstruktů my všichni dobře známe, ale je důležité vědět, že nepoužívá @synchronized(self).

Dalším rozdílem je, že atomové vlastnosti udrží / vývojový cyklus své objekty v kariérista.

Výkon

Zde je zajímavá část: výkon s použitím atomové vlastnosti přistupuje na tabuli (např jednovláknových) případy, může být opravdu velmi rychlý v některých případech. Za méně než ideální případech použití atomových přístupů může stát více než 20krát režii nonatomic. Zatímco napadené případ použití 7 vláken byl 44 krát pomalejší pro tříbytové struct (2,2 GHz Core i7 Quad Core x86_64). Tří-byte struct je příkladem velmi pomalé majetku.

Zajímavé boční poznámka: definované uživatelem přístupové ze tří bajtů struct byly 52 krát rychleji než syntetizovaných atomových přístupové; nebo 84% rychlost syntetizovaných nonatomic přístupové.

Objekty ve sporných případech lze také více než 50 krát.

Vzhledem k počtu optimalizací a variací v implementacích, to je docela obtížné měřit reálných dopadů v těchto souvislostech. Možná budete často slyšet něco jako „Věř to, pokud jste profil a zjistí, že je problém.“ Vzhledem k úrovni abstrakce, je to vlastně docela obtížné změřit skutečný dopad. Paběrkování skutečných nákladů z profilů může být velmi časově náročné, a vzhledem k abstrakci, dosti nepřesné. Stejně ARC vs MRC může udělat velký rozdíl.

Takže pojďme krok zpět, nikoliv se zaměřením na realizaci majetku přistupuje, budeme zahrnovat obvyklé podezřelé, jako je objc_msgSend, a prozkoumat některé reálných výsledků na vysoké úrovni pro mnoho hovorů na NSStringkariérista v nesporných případech (hodnoty v sekundách):

  • MRC | nonatomic | manuálně realizované getry: 2
  • MRC | nonatomic | syntetizován getr: 7
  • MRC | atomová | syntetizován getr: 47
  • ARC | nonatomic | syntetizován kariérista: 38 (poznámka: ARC přidání ref Počet zde jízda na kole)
  • ARC | atomová | syntetizován getr: 47

Jak jste pravděpodobně uhodli, počet odkazů aktivita / jízda na kole je významným přispěvatelem s atomovými zbraněmi a pod pult centrální ochrany. Ty by také větší rozdíly ve sporných případech.

I když jsem se věnovat velkou pozornost na výkon, stále říkám sémantiky první! , Mezitím se výkon s nízkou prioritou pro mnoho projektů. Nicméně s vědomím, podrobnosti realizace a náklady na technologie, které používáte rozhodně není na škodu. Byste měli použít správnou technologii pro vaše potřeby, účely a schopností. Doufejme, že to vám ušetří několik hodin srovnání, a které vám pomohou učinit informované rozhodnutí lépe při navrhování svých programů.

Odpovězeno 18/08/2012 v 10:47
zdroj uživatelem

hlasů
88

Atomic = bezpečnostní nit

Non-atomová = žádné bezpečnostní nit

Bezpečnost Téma:

Instance proměnné jsou thread-bezpečné, pokud se chovají správně při přístupu z více vláken, bez ohledu na plánování nebo prokládání uskutečnění těchto nití ze strany runtime prostředí a bez dalších synchronizaci ani jiné mechanismy koordinace ze strany volající kód.

V našem kontextu:

Pokud se vlákno změní hodnotu instance změněné hodnoty je k dispozici všem závity k dispozici, a jen jedno vlákno může změnit hodnotu v čase.

Kde použít atomic:

v případě, že instance je proměnná bude přistupovat v prostředí s více podprocesy.

Důsledek atomic:

Ne tak rychle, jak jen nonatomicproto, že nonatomicnevyžaduje žádné watchdog na tom pracovat z běhu.

Kde použít nonatomic:

Pokud je proměnná instance se nebude měnit více vláken, můžete jej použít. To zlepšuje výkon.

Odpovězeno 10/07/2013 v 14:07
zdroj uživatelem

hlasů
67

Našel jsem docela dobře dát vysvětlení atomových a non-atomové vlastnosti zde . Zde je několik příslušný text z stejná:

‚atomové‘ znamená, že nemůže být rozebrán. In / programování hlediska OS atomový volání funkce je taková, která nemůže být přerušena - celá funkce musí být provedeny, a nedošlo k záměně z CPU obvyklém kontextu OS je přepínání, dokud není dokončeno. Jen v případě, že jste nevěděli: protože procesor může dělat pouze jednu věc najednou, OS otáčí přístup k CPU na všech běžících procesů v malých časových řezů, čímž se získá iluzi multitasking. Plánovač CPU může (a dělá) přerušit proces v kterémkoliv okamžiku v jeho výkonu - a to i v polovině volání funkce. Takže pro akce, jako aktualizaci sdílené obrannou proměnných, kde dva procesy by se mohly pokusit aktualizovat proměnnou ve stejnou dobu, musí být provedeny ‚atomicky‘, tedy každá aktualizace akce má skončit v celém svém rozsahu, než jakýkoli jiný proces může být vyměněn Na PROCESOR.

Takže bych se hádat, že atomová v tomto případě znamená, že nemůže být přerušena metody atribut čtenář - ve skutečnosti to znamená, že proměnná (y) byly čteny metodou nemůže změnit jejich hodnotu půli, protože některé jiné vlákno / volání / funkce dostane vyměnil na CPU.

Vzhledem k tomu, že atomicproměnné nemůže být přerušena, které je obsaženo jimi v každém bodě je (nit-lock) zaručeno, že neporušené , i když, zajišťuje toto vlákno zámek umožňuje přístup k nim pomalejší. non-atomicproměnné, na druhou stranu, aby takovou záruku, ale nabízejí luxus rychlejší přístup. Kdybychom měli shrnout podstatné, jít s non-atomic, když víte, vaše proměnné nebudou přistupovat více vláken současně i věci urychlit.

Odpovězeno 24/02/2012 v 06:17
zdroj uživatelem

hlasů
61

Po přečtení tolik článků, přetečení zásobníku příspěvky a dělat demo aplikace pro kontrolu variabilní atributů vlastnictví, rozhodl jsem se dát všechny informace o atributy dohromady:

  1. atomic // Default
  2. nonatomic
  3. strong = retain // Default
  4. weak = unsafe_unretained
  5. retain
  6. assign // Default
  7. unsafe_unretained
  8. copy
  9. readonly
  10. readwrite // Default

V článku variabilní atributů vlastnictví nebo modifikátory v systému iOS naleznete všechny výše uvedené vlastnosti, a to vám určitě pomůže.

  1. atomic

    • atomic znamená, že pouze jeden přístup nitě proměnné (statický typ).
    • atomic je vlákno v bezpečí.
    • Ale to je pomalý výkon
    • atomic je výchozí chování
    • Atomové přístupové v non uvolněna prostředí (tedy při použití udržet / uvolnění / autorelease) použije zámek, aby jiné vlákno nenarušuje správné nastavení / získání hodnoty.
    • Je to vlastně není klíčové slovo.

    Příklad:

        @property (retain) NSString *name;
    
        @synthesize name;
    
  2. nonatomic

    • nonatomic znamená Vícechodý závit přístup k proměnné (dynamický typ).
    • nonatomic je thread-bezpečné.
    • Ale to je velmi jednoduché výkonu
    • nonatomicNENÍ výchozí chování. Musíme přidat nonatomicklíčové slovo v atributu majetku.
    • To může vést k neočekávanému chování, při dvou různých procesů (nitě) přístup ke stejné proměnné ve stejnou dobu.

    Příklad:

        @property (nonatomic, retain) NSString *name;
    
        @synthesize name;
    
Odpovězeno 21/03/2013 v 08:10
zdroj uživatelem

hlasů
52

Nejjednodušší odpověď první: Neexistuje žádný rozdíl mezi svými druhými dvěma příklady. Ve výchozím nastavení přístupové objekty jsou atomické.

Atomové přístupové v non uvolněna prostředí (tedy při použití udržet / uvolnění / autorelease) použije zámek, aby jiné vlákno nenarušuje správné nastavení / získání hodnoty.

Podívejte se na „ Výkon a Threading oddíl“ 2,0 dokumentace Apple Objective-C pro některé více informací a pro další úvahy při tvorbě vícevláknových aplikací.

Odpovězeno 26/02/2009 v 03:56
zdroj uživatelem

hlasů
51

Atomic:

Atomové zaručuje, že přístup k objektu bude provedena v atomovém způsobem. Například to vždy vrátit plně inicializuje objekty, žádný get / set určité vlastnosti na jednom vlákně musí dokončit dříve, než jiný může přístup.

Pokud jste si představit následující funkce probíhající na dvě vlákna najednou vidíte, proč výsledky by neměly být dost.

-(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;
  }

  ...
}

Pros: Return of plně vycházejících přímo objektů pokaždé to nejlepší volba v případě multi-threading dělá.

Nevýhody: Výkon hit, dělá spuštění trochu pomaleji

Non-Atomic:

Na rozdíl od Atomic, to nezaručuje plně inicializován objekt vrátit pokaždé.

Pros: Extrémně rychlé spuštění.

Nevýhody: Šance na odpadky hodnoty v případě multi-threading.

Odpovězeno 26/02/2009 v 03:41
zdroj uživatelem

hlasů
31

Atomový znamená pouze jedno vlákno přistupuje proměnnou (statický typ). Atomic je thread-safe, ale to je pomalé.

Nonatomic znamená více vláken přístup proměnné (dynamický typ). Nonatomic je thread-bezpečné, ale to je velmi jednoduché.

Odpovězeno 22/11/2012 v 12:20
zdroj uživatelem

hlasů
14

Atomic je závit bezpečné , to je pomalý a IT dobře ujišťuje (bez záruky) , že pouze je poskytována uzamčené hodnoty bez ohledu na to, kolik vláken pokusu přístup přes stejné zóně. Při použití atomové, kus kódu napsáno uvnitř této funkce se stává součástí kritického úseku, ke kterému může pouze jedno vlákno spustit najednou.

To jen ujišťuje vlákno bezpečnost; to nezaručuje, že. Co mám na mysli, je si najmout odborníka ovladač pro vás auto, stále to není zárukou auto nebude splňovat nehodu. Nicméně zůstává pravděpodobnost nejmenším.

Atomic - to nemůže být rozděleny, takže se očekává, že výsledek. S nonatomic - když jiný přístup nit paměti zóna může jej upravovat, takže výsledek je neočekávaný.

Kód Diskuse:

Atomic, aby získání a nastavení na pozemcích závitu bezpečné. Například pokud u psali:

self.myProperty = value;

je vlákno v bezpečí.

[myArray addObject:@"Abc"] 

NENÍ závit bezpečné.

Odpovězeno 07/07/2015 v 09:56
zdroj uživatelem

hlasů
12

Není tam žádná taková klíčové slovo „atomový“

@property(atomic, retain) UITextField *userName;

Můžeme použít výše uvedené podobné

@property(retain) UITextField *userName;

Viz přetečením zásobníku otázku jsem stále problémy, pokud mohu použít @property (atomový, ponechat) NSString * MyString .

Odpovězeno 08/11/2011 v 06:41
zdroj uživatelem

hlasů
11

Default je atomic, znamená to, že nemá cenu, kterou výkon při každém použití vlastnost, ale je to vlákno v bezpečí. Co Objective-C dělá, je nastaven zámek, takže jediný skutečný vlákno může získat přístup k proměnné, tak dlouho, dokud seřizovač / kariérista je vykonán.

Příklad s MRC nemovitosti s Ivar _internal:

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

Tak to poslední dva jsou stejné:

@property(atomic, retain) UITextField *userName;

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

Na druhou stranu nemá nonatomicnic přidat do svého kódu. Tak to je vlákno bezpečný pouze tehdy, pokud kód bezpečnostní mechanismus sami.

@property(nonatomic, retain) UITextField *userName;

Klíčová slova nemusí být zapsán jako atribut nejprve majetku vůbec.

Nezapomeňte, že to neznamená, že majetek jako celek je thread-safe. Pouze je volání metody z vypalovací / kariérista. Ale pokud použijete setra a poté getr zároveň s 2 různými závity, mohlo by to být rozděleny taky!

Odpovězeno 27/09/2013 v 10:43
zdroj uživatelem

hlasů
9

atomová (default)

Atomic je výchozí: pokud nechcete nic psát, vaše nemovitost je atomová. Atomový nemovitost je zaručeno, že při pokusu o čtení z něj dostanete zpět platnou hodnotu. To nedává žádné záruky ohledně toho, co by mohlo být, že hodnota, ale dostanete zpět dobrá data, ne jen nezdravé paměti. Co to umožňuje udělat, je, pokud máte více závity nebo více procesů ukazuje na jedné proměnné, jedno vlákno může číst a další vlákno může psát. Pokud narazí ve stejné době se čtenář vlákno je zaručeno, že se jeden z těchto dvou hodnot: buď před změnou nebo po změně. Co atomová nedává je nějaký druh záruky o tom, které z těchto hodnot, které by vás mohly dostat. Atomic je opravdu často zaměňován s thread-safe, a to není správné. Musíte zajistit své bezpečnostní nit jiné způsoby. Nicméně, atomová zaručí, že v případě pokusu o čtení, se vrátíš nějakou hodnotu.

nonatomic

Na straně fanda, non-atomová, jak asi tušíte, prostě znamená, „nedělej to atomové věci.“ To, co ztratit, je, že záruka, že vždy vrátit něco. Pokud se pokusíte číst ve středu zápis, mohli byste dostat zpátky zmatená data. Ale na druhou stranu, můžete jít trochu rychleji. Vzhledem k tomu, atomové vlastnosti muset udělat nějaké kouzlo zaručit, že dostanete zpět hodnotu, ale jsou o něco pomalejší. Pokud se jedná o nemovitosti, které jste vstoupili hodně, možná budete chtít klesat k nonatomic, aby se ujistil, že nejste vznikl tento trest rychlosti.

Viz více zde: https://realm.io/news/tmi-objective-c-property-attributes/

Odpovězeno 23/07/2016 v 06:34
zdroj uživatelem

hlasů
8
  • -Atomic znamená pouze jeden přístup nitě proměnné (statický typ).
  • -Atomic je vlákno v bezpečí.
  • -ale to je pomalý výkon

Jak prohlásit:

Jako atomová je výchozí tak,

@property (retain) NSString *name;

A v souboru implementace

self.name = @"sourov";

Předpokládejme, že úkol týkající se třemi vlastnostmi jsou

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

Všechny vlastnosti fungují paralelně (jako asynchronně).

Pokud zavoláte „jméno“ z nití A ,

A

Zároveň, pokud voláte

[self setName:@"Datta"]

od závitu B ,

Nyní Pokud * název vlastnost nonatomic poté

  • Vrátí hodnotu „Datta“ pro A
  • Vrátí hodnotu „Datta“ pro B

To je důvod, proč není atomová se nazývá závit nebezpečné Ale, ale to je velmi jednoduché výkonu kvůli paralelní spouštění

Nyní Pokud * název vlastnost je atomová

  • To zajistí hodnotu „Sourov“ pro
  • Pak se vrátí hodnotu „Datta“ pro B

To je důvod, proč atomové se nazývá závit bezpečné , a to je důvod, proč se tomu říká čtení i zápis v bezpečí

Taková operace situace bude provádět postupně. A pomalý výkonu

- Nonatomic znamená Vícechodý závit přístup k proměnné (dynamický typ).

- Nonatomic je závit nebezpečné.

- ale to je velmi jednoduché výkonu

-Nonatomic NENÍ výchozí chování, musíme přidat nonatomic klíčové slovo v atributu majetku.

U V Swift Potvrzení, že Swift vlastnosti jsou nonatomic ve ObjC smyslu. Jedním z důvodů je, aby si myslíte o tom, zda na pozemku atomicity je dostatečný pro vaše potřeby.

Reference: https://forums.developer.apple.com/thread/25642

Fro více informací naleznete na webových stránkách http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html

Odpovězeno 13/12/2016 v 03:27
zdroj uživatelem

hlasů
8

Používáte-li vaše nemovitost v multi-threaded kód, pak byste být schopni vidět rozdíl mezi nonatomic a atomových vlastností. Nonatomic je rychlejší než atomová a atomová je thread-safe, ne nonatomic.

Vijayendra Tripathi již uveden příklad pro prostředí s více vlákny.

Odpovězeno 13/08/2014 v 12:57
zdroj uživatelem

hlasů
7

Než začnete: Musíte vědět, že každý objekt v paměti je třeba uvolnit z paměti pro nový zápis se stane. Nemůžete prostě napsat na vrcholu něco jako ty na papíře. Vy musíte nejprve vymazat (dealloc) jej a pak si můžete napsat na něj. Pokud v okamžiku, kdy mazání se provádí (nebo půl je hotovo) a nic dosud nebyla napsal (nebo polovina napsal) a pokusu o čtení by to mohlo být velmi problematické! Atomová a nonatomic pomůže léčit tento problém různými způsoby.

Nejprve přečíst tuto otázku a pak si přečtěte Bbum jeho odpověď . Dále pak číst mé shrnutí.


atomic bude vždy zárukou

  • Pokud jsou dva různí lidé chtějí číst a psát ve stejnou dobu, váš papír nebude jen hořet! -> Aplikace nebude nikdy dojít k selhání, a to iv spor.
  • Pokud se jedna osoba se snaží psát a má napsal pouze 4 z 8 dopisy napsané, pak není možné číst ve středu, čtení může být provedeno pouze tehdy, pokud jsou všechny dopisy 8 je psáno -> No read (si) se stane na ‚nit, která je ještě psaní‘, tedy pokud existuje 8 bytů na byty, které mají být písemná, a jen 4 byty jsou zapsány - až do té chvíle, nejste oprávněn číst z něj. Ale protože jsem řekl, že se nezhroutí, pak by četl z hodnoty za autoreleased objektu.
  • Pokud předtím, než psát jste již vymazal to, co bylo dříve napsané na papíře a pak někdo chce číst vy můžete ještě přečíst. Jak? Budete číst z něčeho podobného Mac OS koše (jak Trash bin není ještě 100% smazány ... to je v limbu) ---> Pokud ThreadA je číst, zatímco ThreadB již dealloced psát, byste mohl buď získat hodnotu z konečné plně písemné hodnotu o ThreadB nebo si něco z autorelease bazénu.

Zachovávají počítá se způsobem, jakým je paměť řízena v Objective-C. Při vytvoření objektu, to má udržet počet 1. Při odesílání určitý objekt ponechat zprávy, její udržet počet se zvyšuje o 1. Při odesílání objektu zprávu uvolnění, jeho udržet počet se sníží o 1. Když poslat objekt je autorelease zprávu , její udržet počet se sníží o 1 v určité fázi v budoucnosti. Pokud do object's udržet počet se sníží na 0 ° C, je uvolnit.

  • Atomic není zaručena bezpečnost vlákno, i když jeho užitečné pro dosažení vlákno bezpečnost. Thread Safety je vzhledem k tomu, jak psát kód, který / závit fronta se čtení / zápis z. To jen garantuje non-crashable multithreading.

Počkej co?! Jsou multithreading a bezpečnostní vlákno liší?

Ano. Multithreading znamená: více vláken může číst společnou část dat ve stejnou dobu a budeme nespadne, ale to nezaručuje, že nejste čtení z non-autoreleased hodnotu. S bezpečností závitem, je zaručeno, že to, co čtete, není auto-povolený. Důvod, že nebudeme dělat všechno atomová je ve výchozím nastavení, protože tam je cena výkon a pro většinu věcí, které vlastně nepotřebujete vlákno bezpečnost. Několik částí našeho kódu ji potřebují, a těch pár dílů musíme psát náš kód do závitu bezpečným způsobem s využitím zámky, mutex nebo synchronizaci.


nonatomic

  • Protože neexistuje žádná taková věc, jako je Mac OS koše, pak se nikdo nestará, zda jste či nejste vždy hodnotu (<- Tato skutečnost by mohla vést k havárii), ani by to někoho zajímalo, jestli se někdo pokusí číst půli píšeš (ačkoli v polovině psaní v paměti, je velmi odlišná od poloviny psaní na papír, na paměti, že mohl dát bláznivou hloupost hodnotu předtím, zatímco na papíře vidíte jen polovinu toho, co to už napsal) -> nezaručuje nespadne, protože nepoužívá autorelease mechanismus.
  • Nezaručuje úplné psané hodnoty, které mají být číst!
  • Je rychlejší než atomová

Celkově se liší ve 2 aspekty:

  • Shazovat, nebo ne, protože mají nebo nemají autorelease bazén.

  • Umožňující číst přímo uprostřed ‚ještě neskončila write nebo prázdná hodnota‘ nebo nedovoluje a pouze umožňuje číst, když je hodnota plně v písemné formě.

Odpovězeno 28/04/2016 v 16:18
zdroj uživatelem

hlasů
7

Před diskusí o atributech @property, měli byste vědět, co je použití @property. @property nabízí způsob, jak definovat informace, že třída je určena k zapouzdření. Pokud deklarovat objektovou / proměnné pomocí @property, pak tento objekt / proměnná bude mít přístup k jiným třídám dovážejí své třídě. Pokud deklarovat objektu pomocí @property v záhlaví souboru, pak budete muset syntetizovat pomocí @synthesize v souboru implementace.

Příklad:

.h class

@interface ExampleClass : NSObject
   @property (nonatomic, retain) NSString *name;
@end

.m class

@implementation ExampleClass
   @synthesize name;
@end

Nyní překladač syntetizovat accessor metody pro jména.

ExampleClass *newObject=[[ExampleClass alloc]init];
NSString *name1=[newObject name]; // get 'name'
[obj setName:@“Tiger”];

Seznam atributů @property: atomová. nonatomic. udržet. kopírovat. pouze ke čtení. číst psát. přiřadit. silný.

atomic: Jedná se o výchozí chování. Je-li objekt je deklarován jako atomová pak se to stane thread-safe. Thread-safe prostředky, v době jediný závit konkrétní instanci této třídy může mít kontrolu nad tímto objektem.

Příklad:

@property NSString *name; //by default atomic
@property (atomic)NSString *name; // explicitly declared atomic

nonatomic: To není thread-safe. Můžete použít nonatomic atribut vlastnost k určení, že syntetizované přístupové jednoduše nastavit nebo vrátit hodnotu přímo, bez jakékoliv záruky o tom, co se stane, pokud je stejná hodnota je zobrazena současně z různých nití. Z tohoto důvodu je to rychlejší přístup k nonatomic vlastnosti než atomové jeden. @property (nonatomic)NSString *name;

zachovat: je nutný, pokud je atribut ukazatel na způsobu object.The vypalovacího zvýší udržet počet objektu, takže to bude zabírat paměť autorelease bazénu. @property (retain)NSString *name;

Kopie: Použijete-li kopírovat, nelze použít zachovat. Používání kopie instance třídy bude obsahovat vlastní kopii. I když je proměnlivý řetězec nastavit a následně změní, například zachycuje bez ohledu na hodnotu má v době, kdy je nastavena. budou syntetizovány žádné seřizovač a getrové metody.

@property (copy) NSString *name;

NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];    
xyzObj.name = nameString;    
[nameString appendString:@"Pizza"];

readonly: Pokud nechcete, aby majetek, které mají být změněny pomocí vypalovacího způsobem, můžete deklarovat vlastnost jen pro čtení. @property (readonly) NSString *name;

readwrite: je výchozí chování. Nemusíte specifikovat readwrite atribut explicitně.

@property (readwrite) NSString *name;

přiřadit: vygeneruje seřizovač, která přiřazuje hodnotu proměnné instance přímo, spíše než kopírování nebo zachování jej. To je nejlepší pro primitivní typy jako NSInteger a CGFloat nebo objekty, které nejsou přímo vlastní, jako delegátů.

@property (assign) NSInteger year;

silné: je náhradou za udržet. @property (nonatomic, strong) AVPlayer *player;

unsafe_unretained: Existuje několik tříd v kakao a kakaové kontaktu, které ještě nepodporují slabé reference, což znamená, že nelze prohlásit slabou vlastnost nebo slabé lokální proměnné sledovat z nich. Tyto třídy zahrnují NSTextView, NSFont a NSColorSpace atd. Pokud potřebujete použít slabý odkaz na jedné z těchto tříd, je nutné použít nebezpečný odkaz. Nebezpečný odkaz je podobný slabé reference v tom, že nevede ním související objekt naživu, ale nebude nastaveno na nulu, pokud je cílový objekt navrácen.

@property (unsafe_unretained) NSObject *unsafeProperty;

Odpovězeno 18/06/2015 v 05:25
zdroj uživatelem

hlasů
4

Atomový vlastnost zajišťuje udržet plně inicializovat hodnotu bez ohledu na to, kolik niti dělají kariérista & seřizovač na něm.

Nonatomic vlastnost určuje, že syntetizovaný přístupové jednoduše nastavit nebo vrátit hodnotu přímo, bez jakékoliv záruky o tom, co se stane, pokud je stejná hodnota je zobrazena současně z různých nití.

Odpovězeno 23/10/2015 v 15:41
zdroj uživatelem

hlasů
3

Atomic znamená jen jedno vlákno může přistupovat k proměnné v čase (statický typ). Atomic je thread-safe, ale to je pomalé.

Nonatomic znamená více vláken přístup proměnné ve stejnou dobu (dynamický typ). Nonatomic je thread-bezpečné, ale to je velmi jednoduché.

Odpovězeno 01/02/2016 v 08:27
zdroj uživatelem

hlasů
2

Pokud používáte atomová, znamená to, že nit bude v bezpečí a jen pro čtení. Pokud používáte nonatomic, to znamená, že více vláken přístup proměnné a je nit nebezpečné, ale je proveden rychle, udělal čtecí a zapisovací operace; to je dynamický typ.

Odpovězeno 13/02/2016 v 13:34
zdroj uživatelem

hlasů
0

Atomicity atomová (default)

Atomic je výchozí: pokud nechcete nic psát, vaše nemovitost je atomová. Atomový nemovitost je zaručeno, že při pokusu o čtení z něj dostanete zpět platnou hodnotu. To nedává žádné záruky ohledně toho, co by mohlo být, že hodnota, ale dostanete zpět dobrá data, ne jen nezdravé paměti. Co to umožňuje udělat, je, pokud máte více závity nebo více procesů ukazuje na jedné proměnné, jedno vlákno může číst a další vlákno může psát. Pokud narazí ve stejné době se čtenář vlákno je zaručeno, že se jeden z těchto dvou hodnot: buď před změnou nebo po změně. Co atomová nedává je nějaký druh záruky o tom, které z těchto hodnot, které by vás mohly dostat. Atomic je opravdu často zaměňován s thread-safe, a to není správné. Musíte zajistit své bezpečnostní nit jiné způsoby. Nicméně, atomová zaručí, že v případě pokusu o čtení, se vrátíš nějakou hodnotu.

nonatomic

Na straně fanda, non-atomová, jak asi tušíte, prostě znamená, „nedělej to atomové věci.“ To, co ztratit, je, že záruka, že vždy vrátit něco. Pokud se pokusíte číst ve středu zápis, mohli byste dostat zpátky zmatená data. Ale na druhou stranu, můžete jít trochu rychleji. Vzhledem k tomu, atomové vlastnosti muset udělat nějaké kouzlo zaručit, že dostanete zpět hodnotu, ale jsou o něco pomalejší. Pokud se jedná o nemovitosti, které jste vstoupili hodně, možná budete chtít klesat k nonatomic, aby se ujistil, že nejste vznikl tento trest rychlosti. Přístup

zdvořilost https://academy.realm.io/posts/tmi-objective-c-property-attributes/

atributy Atomicity vlastnictví (atomová a nonatomic) se neprojeví v odpovídajícím prohlášení Swift majetku, ale atomicity záruky implementace Objective-C stále drží, je-li dováženy vlastnost přístupná z Swift.

Takže - pokud definujete atomový nemovitosti v Objective-C zůstane atomový když použitý Swift.

zdvořilost https://medium.com/@YogevSitton/atomic-vs-non-atomic-properties-crash-course-d11c23f4366c

Odpovězeno 29/01/2019 v 06:12
zdroj uživatelem

hlasů
0

Atomové vlastnosti : - Je-li proměnná přiřazena s atomovým vlastnost, která znamená, že má pouze jeden přístup závitu a bude to vlákno v bezpečí a bude dobré výkonnosti perspektivě, bude mít výchozí chování.

Non Atomové vlastnosti : - Je-li proměnná přiřazena s atomovým vlastnost, která znamená, že má multi přístup závitu a nebude vlákno v bezpečí a bude pomalý výkonnosti perspektivě bude mít výchozí chování a když dva různé nitě chcete přístup k proměnné ve stejnou dobu to bude dávat neočekávané výsledky.

Odpovězeno 04/08/2018 v 11:26
zdroj uživatelem

hlasů
0

Pravdou je, že používají zámek odstřeďování realizovat atomové majetek. Kód jak je uvedeno níže:

 static inline void reallySetProperty(id self, SEL _cmd, id newValue, 
      ptrdiff_t offset, bool atomic, bool copy, bool mutableCopy) 
    {
        id oldValue;
        id *slot = (id*) ((char*)self + offset);

        if (copy) {
            newValue = [newValue copyWithZone:NULL];
        } else if (mutableCopy) {
            newValue = [newValue mutableCopyWithZone:NULL];
        } else {
            if (*slot == newValue) return;
            newValue = objc_retain(newValue);
        }

        if (!atomic) {
            oldValue = *slot;
            *slot = newValue;
        } else {
            spin_lock_t *slotlock = &PropertyLocks[GOODHASH(slot)];
            _spin_lock(slotlock);
            oldValue = *slot;
            *slot = newValue;        
            _spin_unlock(slotlock);
        }

        objc_release(oldValue);
    }
Odpovězeno 09/12/2016 v 04:58
zdroj uživatelem

hlasů
0

Zjednodušit celý zmatek abychom pochopili mutex lock.Mutex zámek podle názvu uzamkne nestálost na object.So pokud je objekt přístupný třídě žádná jiná třída může přistupovat ke stejnému object.In iOS @sychronise také poskytnout mutex lock.Now sloužit v režimu FIFO a zajišťuje průtok není ovlivněn dvěma třídami, které sdílejí stejnou instance.However, pokud je úkol na hlavní vlákno přípravku zabránit přistupujícího objektu pomocí atomové vlastnosti, jak to může držet své uživatelské rozhraní a snížit výkon

Odpovězeno 23/09/2016 v 18:41
zdroj uživatelem

hlasů
0

Atomic: Zajistěte nit-bezpečnostní uzamčením nit pomocí NSLOCK.

Non atomic: Bez zajištění závitů bezpečnost, protože není thread-blokovací mechanismus.

Odpovězeno 29/06/2016 v 08:56
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more