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

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

@property BOOL followVenmo;

по умолчанию равно

@property (nonatomic) BOOL followVenmo;

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

Что это такое

Ответы [ 3 ]

10 голосов
/ 27 июля 2011

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

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

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

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

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

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

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

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

0 голосов
/ 28 октября 2013

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

Я буду придерживаться @ рекомендации Ревеня :

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

0 голосов
/ 27 июля 2011

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

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

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

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

...