Objective-C: по умолчанию атомарный для скалярных свойств?

Один мой друг сказал мне, что @property по умолчанию для скалярных свойств (BOOL, NSInteger и т. Д.) Неатомично. То есть,

@property BOOL followVenmo;

по умолчанию

@property (nonatomic) BOOL followVenmo;

Но у меня всегда было впечатление, что по умолчанию всегда атомарный, скалярный или нет.

Что он?

3 ответа

Решение

Основываясь на моем исследовании пары других связанных вопросов:

Я буду соблюдать рекомендацию @Rhubarb:

Как правило, если вам не нужна многопоточная поддержка - что обычно не требуется, если вы работаете в коде пользовательского интерфейса, таком как UIViewControllers, тогда просто объявите все это неатомным.

Будьте осторожны с этой "скалярной" терминологией. Свойство NSString * также является указателем, точно так же, как в примере, который вы указали с указателем на BOOL.

Из документов Apple: (язык программирования Objective-C)

Если вы укажете retain или же copy и не уточняйте nonatomic затем в среде с подсчетом ссылок синтезированный метод доступа get для свойства объекта использует блокировку, сохраняет и автоматически высвобождает возвращаемое значение - реализация будет аналогична следующей:

[_internal lock]; // lock using anobject-levellock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

Вы не можете применить блокировку уровня объекта к чему-то, что не является объектом, поэтому (не) атомарное в свойствах примитивных типов в принципе не имеет никакого эффекта.

Вы можете сделать вывод, что атомарность применяется только к свойствам объекта, и это подтверждается в документах:

Если вы укажете nonatomic Синтезированный метод доступа к свойству объекта просто возвращает значение напрямую.

Чтобы уточнить, следует ли указывать одно или другое: технически, свойства без nonatomic считаются атомарными, но помните, что это не имеет значения для примитивных типов. Таким образом, вы можете сохранить некоторые печатать и избегать nonatomic в этих.

Из документации разработчика

nonatomic Указывает, что методы доступа не являются атомарными. По умолчанию методы доступа являются атомарными.

Атомные свойства гарантируют, что вы получите или установите целое значение. Например, установка CGRect из 2-х потоков приведет к тому или иному, а не к какому-то их сочетанию.

Для сохраненных свойств это также гарантирует, что результат может пережить получателя. Например, вы получаете результат от объекта, который освобождается другим потоком до завершения вызова, но результат сохраняется и автоматически высвобождается от вашего имени, поэтому он остается действительным.

Другие вопросы по тегам