Синтаксис и семантика уже хорошо определены другими превосходными ответами на этот вопрос. Поскольку исполнение и исполнение не детализированы, я добавлю свой ответ.
Какая функциональная разница между этими 3?
Я всегда считал атомарным по умолчанию довольно любопытно. На уровне абстракции мы работаем над использованием атомарных свойств для класса в качестве транспортного средства для достижения 100% -ной безопасности потока - это угловой случай. Для действительно правильных многопоточных программ вмешательство программиста почти наверняка является требованием. Между тем, характеристики производительности и исполнения еще не были подробно описаны. Написав несколько многопоточных программ за эти годы, я все время объявлял свои свойства как nonatomic
, потому что атомарное не было разумно ни для каких целей. Во время обсуждения деталей атомных и неатомных свойств на этот вопрос я при некотором профилировании столкнулся с любопытными результатами.
Исполнение
Ok. Первое, что я хотел бы прояснить, это то, что реализация блокировки определяется реализацией и абстрагируется. Луи использует @synchronized(self)
в своем примере - я видел это как общий источник путаницы. Реализация на самом деле не используется @synchronized(self)
; он использует уровень объекта спин-блокировки . Иллюстрация Луи хороша для иллюстрации высокого уровня, использующей конструкции, с которыми мы все знакомы, но важно знать, что она не использует @synchronized(self)
.
Другое отличие состоит в том, что атомарные свойства будут сохранять / освобождать цикл ваших объектов в геттере.
Производительность
Вот интересная часть: производительность с использованием атомарного доступа к свойствам в неоспоримых (например, однопоточных) случаях может быть действительно очень высокой в некоторых случаях. В далеко не идеальных случаях использование атомарного доступа может стоить более чем в 20 раз дороже nonatomic
. В то время как случай Contested с использованием 7 потоков был в 44 раза медленнее для трехбайтовой структуры (2,2 ГГц Core i7 Quad-Core, x86_64). Трехбайтовая структура является примером очень медленного свойства.
Интересное примечание: определяемые пользователем методы доступа трехбайтовой структуры были в 52 раза быстрее, чем синтезированные атомарные методы доступа; или 84% скорости синтезированных неатомных акцессоров.
Количество объектов в оспариваемых случаях также может превышать 50 раз.
Из-за большого количества оптимизаций и вариаций в реализации очень сложно измерить реальные воздействия в этих контекстах. Вы можете часто слышать что-то вроде «Доверяйте этому, если вы не профилируете и не найдете это проблемой» Из-за уровня абстракции на самом деле довольно сложно измерить фактическое влияние. Сбор фактических затрат из профилей может занять очень много времени, а из-за абстракций довольно неточен. Кроме того, ARC против MRC может иметь большое значение.
Итак, давайте сделаем шаг назад, не , сосредоточив внимание на реализации доступа к свойствам, мы включим обычных подозреваемых, таких как objc_msgSend
, и рассмотрим некоторые реальные высокоуровневые результаты для многих обращений к NSString
геттер в неоспоримых случаях (значения в секундах):
- MRC | неатомный | получаемые вручную геттеры: 2
- MRC | неатомный | синтезированный геттер: 7
- MRC | атомный | синтезированный геттер: 47
- ARC | неатомный | Синтезированный геттер: 38 (примечание: ARC добавляет количество циклов отсчета здесь)
- ARC | атомный | синтезированный геттер: 47
Как вы уже, наверное, догадались, активность / циклический подсчет ссылок вносит значительный вклад в атомарность и в ARC. Вы также увидите большие различия в оспариваемых делах.
Хотя я уделяю пристальное внимание производительности, я все же говорю Семантика первая! . Между тем, производительность является низким приоритетом для многих проектов. Однако знание деталей исполнения и стоимости используемых вами технологий, безусловно, не повредит. Вы должны использовать правильную технологию для ваших нужд, целей и способностей. Надеюсь, это сэкономит вам несколько часов сравнений и поможет вам принять более взвешенное решение при разработке ваших программ.