Objective-C: по умолчанию атомарный для скалярных свойств?
Один мой друг сказал мне, что @property по умолчанию для скалярных свойств (BOOL, NSInteger и т. Д.) Неатомично. То есть,
@property BOOL followVenmo;
по умолчанию
@property (nonatomic) BOOL followVenmo;
Но у меня всегда было впечатление, что по умолчанию всегда атомарный, скалярный или нет.
Что он?
3 ответа
Основываясь на моем исследовании пары других связанных вопросов:
- Свойства Objective-c для примитивных типов
- Значит ли Atomic что-нибудь для синтезированного примитива?
Я буду соблюдать рекомендацию @Rhubarb:
Как правило, если вам не нужна многопоточная поддержка - что обычно не требуется, если вы работаете в коде пользовательского интерфейса, таком как UIViewControllers, тогда просто объявите все это неатомным.
Будьте осторожны с этой "скалярной" терминологией. Свойство NSString * также является указателем, точно так же, как в примере, который вы указали с указателем на BOOL.
Из документов Apple: (язык программирования Objective-C)
Если вы укажете
retain
или жеcopy
и не уточняйтеnonatomic
затем в среде с подсчетом ссылок синтезированный метод доступа get для свойства объекта использует блокировку, сохраняет и автоматически высвобождает возвращаемое значение - реализация будет аналогична следующей:
[_internal lock]; // lock using an
object-level
lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;
Вы не можете применить блокировку уровня объекта к чему-то, что не является объектом, поэтому (не) атомарное в свойствах примитивных типов в принципе не имеет никакого эффекта.
Вы можете сделать вывод, что атомарность применяется только к свойствам объекта, и это подтверждается в документах:
Если вы укажете
nonatomic
Синтезированный метод доступа к свойству объекта просто возвращает значение напрямую.
Чтобы уточнить, следует ли указывать одно или другое: технически, свойства без nonatomic
считаются атомарными, но помните, что это не имеет значения для примитивных типов. Таким образом, вы можете сохранить некоторые печатать и избегать nonatomic
в этих.
nonatomic Указывает, что методы доступа не являются атомарными. По умолчанию методы доступа являются атомарными.
Атомные свойства гарантируют, что вы получите или установите целое значение. Например, установка CGRect из 2-х потоков приведет к тому или иному, а не к какому-то их сочетанию.
Для сохраненных свойств это также гарантирует, что результат может пережить получателя. Например, вы получаете результат от объекта, который освобождается другим потоком до завершения вызова, но результат сохраняется и автоматически высвобождается от вашего имени, поэтому он остается действительным.