Вот отличный пост о разнице между atomic
и nonatomic
:
Предполагая, что вы @ynthesizing реализации метода, атомарный
против неатомарных изменений сгенерированного кода. Если вы пишете свой собственный
сеттер / геттеры, атомарные / неатомные / сохранить / назначить / копировать просто
консультативный.
С атомарным, синтезированный сеттер / геттер обеспечит
значение всегда возвращается из получателя или устанавливается установщиком,
независимо от активности сеттера в любом другом потоке. То есть если нить
A находится в середине геттера, в то время как поток B вызывает сеттер,
Фактическое жизнеспособное значение - объект с автоматически выпущенным кодом, скорее всего - будет
вернулся к звонящему в А.
В неатомной промышленности такие гарантии не предоставляются. Таким образом, неатомный
значительно быстрее, чем атомный.
То, что не делает Atomic, это делает какие-либо гарантии безопасности потоков. Если
поток A вызывает геттер одновременно с потоками B и C
Вызов установщика с разными значениями, поток А может получить любой из
три возвращенных значения - одно до вызова любых сеттеров
или любое из значений, переданных в установщики в B и C. Аналогично,
объект может в конечном итоге получить значение из B или C, невозможно сказать.
Обеспечение целостности данных - одна из основных задач
многопоточное программирование - достигается другими средствами.
Обратите внимание, что по умолчанию atomic
, поэтому последний пример эквивалентен
@property (atomic) int myInt
Другое значение по умолчанию - assign
, поэтому эти два параметра эквивалентны:
@property (nonatomic, assign) int myInt
@property (nonatomic) int myInt
И, аналогично, следующие также эквивалентны
@property (atomic, assign) int myInt
@property (atomic) int myInt
РЕДАКТИРОВАТЬ: Как указывает Джош, включение atomic
является гипотетическим примером.