Курс па атамнай супраць не атамных уласцівасцей

Уласцівасці Objective-C можна вызначыць як атамныя альбо неатамныя.

У чым розніца паміж імі і як паводзяць сябе ўласцівасці Swift? Атамная ці неатамная?

Атамныя ўласцівасці

Вызначэнне ўласцівасці як атамнай гарантуе вяртанне сапраўднага значэння. Звярніце ўвагу, што сапраўднасць не заўсёды азначае правільнасць (падрабязней пра гэта ў наступным раздзеле гэтага паста).

Гэта таксама не азначае, што атамныя ўласцівасці з'яўляюцца бяспечнымі для нітак. Розныя тэмы могуць паспрабаваць пісаць і чытаць адначасова. Будзе вернута адно з двух значэнняў - значэнне перад змяненнем або значэнне змены

Атамныя ўласцівасці пакутуюць ад нязначных паказчыкаў эфектыўнасці з-за блакавання і разблакіроўкі да і пасля ўстаноўкі / атрымання значэння.

Atomic - гэта паводзіны па змаўчанні для ўласцівасцей - гэта тое, што вы атрымаеце, калі нічога не ўказваеце.

Атамныя ўласцівасці і прыклад нітак

Дапусцім, у нас ёсць атамная ўласцівасць:

кропка = CGPoint (х: 10, у: 10)

У нашым дадатку ў нас ёсць тры тэмы, якія адначасова спрабуюць атрымаць доступ да нашага пункту.

  • Тэма спрабуе прачытаць уласцівасць CGPoint
  • Нітка B - гэта кропка пастаноўкі = CGPoint (x: 1, y: 1)
  • Нітка C з'яўляецца зададзеным пунктам = CGPoint (x: 5, y: 5)

Вялікае пытанне - што будзе вернута ў тэму A?

Адно з наступных трох значэнняў:

(х = 10, у = 10)
(х = 1, у = 1)
(х = 5, у = 5)

Яшчэ адно пытанне, які мы можам задаць, - такое, якое будзе канчатковае значэнне кропкі?

Адно з наступных двух значэнняў:

(х = 1, у = 1)
(х = 5, у = 5)

Неатамныя ўласцівасці

Неатамныя ўласцівасці не гарантуюць вяртаецца значэнне. Гэта можа быць правільнае значэнне, часткова напісанае значэнне ці нават нейкае смецце.
Як і большасць рэчы, якія не з'яўляюцца бяспечнымі, гэта звязана з падвышанай хуткасцю доступу да гэтай уласцівасці.

Неатамныя ўласцівасці і прыклад нітак

Возьмем адно і тое ж уласцівасць пункта і тыя ж тры тэмы, што робяць сапраўды гэтак жа, як у прыкладзе тэмы атамных уласцівасцей.

Што будзе вернута тэме A?

Невядома! Гэта можа быць адно з трох розных значэнняў у папярэднім прыкладзе. Гэта можа быць нават (x = 5, y = 1) дзве тэмы спрабуюць адначасова ўсталяваць значэнне. Значэнне часткова напісана, і мы вяртаем часткова напісанае значэнне.

Як гэта адбываецца падчас Objective-C?

Давайце разгледзім метад "зададзенага значэння" на час выканання аб'ектыўнага C.

Звярніце ўвагу, як неатамныя ўласцівасці непасрэдна ўсталёўваюць значэнне ўласцівасці, а атамная ўласцівасць выкарыстоўвае блакіроўкі для абароны зададзенай працы.

А як з Свіфтам?

Уласцівасці Swift па змаўчанні не атамныя.
Але - паводле Apple, які выкарыстоўвае Swift з какава і Objective-C (Swift 3.1):

Атрыбуты ўласнасці Atomicity (атамныя і неатамныя) не адлюстроўваюцца ў адпаведнай дэкларацыі аб уласцівасці Swift, але гарантыі атаматычнасці рэалізацыі Objective-C па-ранейшаму выконваюцца, калі доступ да імпартаванай уласнасці ажыццяўляецца з Swift.

Такім чынам - калі вы вызначыце атамную ўласцівасць у Objective-C, яна будзе заставацца атамнай пры выкарыстанні Swift.