Havarijní kurz atomových vs. neatomových vlastností

Vlastnosti Objective-C lze definovat jako atomové nebo nearomatické.

Jaký je rozdíl mezi těmito dvěma a jak se chovají vlastnosti Swift? Atomová nebo ne atomová?

Atomové vlastnosti

Definování vlastnosti jako atomové zaručuje, že bude vrácena platná hodnota. Všimněte si, že platné neznamená vždy správné (více k tomu v další části tohoto příspěvku).

To také neznamená, že atomové vlastnosti jsou bezpečné pro vlákno. Různá vlákna se mohou pokusit psát a číst současně. Vrátí se jedna ze dvou hodnot - hodnota před změnou nebo hodnota změny

Atomové vlastnosti trpí menším zásahem do výkonu v důsledku zamykání a odemykání před a po nastavení / získání hodnoty.

Atomic je výchozí chování pro vlastnosti - to je to, co získáte, pokud nic neurčíte.

Příklad atomových vlastností a nití

Řekněme, že máme atomovou vlastnost:

point = CGPoint (x: 10, y: 10)

V naší aplikaci máme tři vlákna, která se současně pokoušejí získat přístup k naší vlastnosti bodu.

  • Vlákno A se snaží číst vlastnost CGPoint
  • Vlákno B je nastavovací bod = CGPoint (x: 1, y: 1)
  • Vlákno C je nastavovací bod = CGPoint (x: 5, y: 5)

Velkou otázkou je - co se vrátí do vlákna A?

Jedna z následujících tří hodnot:

(x = 10, y = 10)
(x = 1, y = 1)
(x = 5, y = 5)

Další otázku, kterou si můžeme položit, je - jaká bude konečná hodnota vlastnosti point?

Jedna z následujících dvou hodnot:

(x = 1, y = 1)
(x = 5, y = 5)

Non Atomic Properties

Non atomické vlastnosti nemají žádnou záruku ohledně vrácené hodnoty. Může to být správná hodnota, částečně zapsaná hodnota nebo dokonce nějaká hodnota odpadu.
Protože většina věcí, které nejsou bezpečné, přichází se zvýšenou rychlostí přístupu k těmto vlastnostem.

Příklad neatomických vlastností a nití

Vezměme si stejnou vlastnost bodu a stejná tři vlákna, která dělají přesně stejné věci jako v příkladu vláken atomových vlastností.

Co se vrátí do vlákna A?

Neznámý! Může to být jedna ze tří různých hodnot v předchozím příkladu. Mohlo by to být dokonce (x = 5, y = 1) dva vlákna se snaží nastavit hodnotu současně. Hodnota byla částečně zapsána a dostáváme zpět částečně zapsanou hodnotu.

Jak to dělá běhový modul Objective-C?

Pojďme se podívat na metodu „set value“ pro dobu běhu Objective-C.

Všimněte si, jak nejaderné vlastnosti přímo nastavují hodnotu vlastnosti, zatímco atomová vlastnost používá zámky k ochraně operace operace.

A co Swift?

Swiftové vlastnosti jsou ve výchozím stavu atomické.
Ale - Podle Appleova používání Swift s kakaem a Objective-C (Swift 3.1):

Atomické atributy vlastností (atomové a neatomické) se neodrážejí v odpovídajícím prohlášení o vlastnostech Swift, ale záruky atomicity implementace Objective-C stále platí, když je importovaná vlastnost přístupná ze Swift.

Takže - pokud v Objective-C definujete atomovou vlastnost, zůstane atomická při použití Swiftem.