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?
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?
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í - nonatomicatomicbyl 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.
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.
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ě.
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):
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ů.
Atomic = bezpečnostní nit
Non-atomová = žádné bezpečnostní nit
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.
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.
atomic:v případě, že instance je proměnná bude přistupovat v prostředí s více podprocesy.
atomic:Ne tak rychle, jak jen nonatomicproto, že nonatomicnevyžaduje žádné watchdog na tom pracovat z běhu.
nonatomic:Pokud je proměnná instance se nebude měnit více vláken, můžete jej použít. To zlepšuje výkon.
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.
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:
atomic // Defaultnonatomicstrong = retain // Defaultweak = unsafe_unretainedretainassign // Defaultunsafe_unretainedcopyreadonlyreadwrite // DefaultV č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.
atomic
atomic znamená, že pouze jeden přístup nitě proměnné (statický typ).atomic je vlákno v bezpečí.atomic je výchozí chováníPříklad:
@property (retain) NSString *name;
@synthesize name;
nonatomic
nonatomic znamená Vícechodý závit přístup k proměnné (dynamický typ).nonatomic je thread-bezpečné.nonatomicNENÍ výchozí chování. Musíme přidat nonatomicklíčové slovo v atributu majetku.Příklad:
@property (nonatomic, retain) NSString *name;
@synthesize name;
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í.
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
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.
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é.
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é.
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 .
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!
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/
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é
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 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
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.
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
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.
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
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ě.
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;
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í.
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é.
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.
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
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.
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);
}
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
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.