Должны ли все свойства быть объявлены "неатомными"? - PullRequest
9 голосов
/ 24 мая 2011

Мне интересно: должны ли все свойства в разработке iPhone быть nonatomic?Если так, то почему?

Ответы [ 4 ]

9 голосов
/ 24 мая 2011

С Язык программирования Objective-C , обязательное руководство:


Атомность

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

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

Свойства по умолчанию являются атомарными, поэтому синтезированные методы доступа обеспечивают надежный доступ к свойствам в многопоточной среде, то есть к значению, возвращаемому из метода получения или устанавливаемому черезсеттер всегда полностью извлекается или устанавливается независимо от того, какие другие потоки выполняются одновременно.Подробнее см. «Производительность и многопоточность».

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

[_internal lock]; // lock using an object-level lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

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

6 голосов
/ 24 мая 2011

Свойства могут быть либо atomic, либо nonatomic.

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

Если вы объявите свойство atomic, тогда запись будет поточно-ориентированной, но будет намного медленнее (так как она должна синхронизировать ее, чтобы никто больше ее не трогал)

1 голос
/ 25 октября 2012

Производительность снижается, но если вы хотите быстро написать код, «записываемое атомарное свойство« имя »не может связать синтезированный установщик с определяемым пользователем геттером», поэтому лучше использовать неатомарный, потому что позже Если вы хотите переопределить метод get, у него есть проблема с синтезированным сеттером, который обычно не нужно перезаписывать.

1 голос
/ 24 мая 2011

По умолчанию свойства являются атомарными, если вы не объявите иначе с ключевым словом nonatomic. Это гарантирует, что несколько потоков не получат доступ к свойству, пока вы получаете или устанавливаете его значение (хотя это не гарантирует безопасность потоков). С этим поведением связана потеря производительности. На рабочем столе это не так важно, но на iPhone лучше использовать неатомарную, поскольку мощность вашего процессора более ограничена, по крайней мере, для тех классов, которые, как вы знаете, будут использоваться только в основном потоке.

См. Также этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...