Почему свойства всегда говорят, что они неатомичны в Objective C?

Говорят, что опция nonatomic сделает ваш метод set быстрее. Я искал ее, но не мог понять. Может ли кто-нибудь сказать мне, почему?

Ответ 1

Объявление свойства atomic заставляет компилятор генерировать дополнительный код, который предотвращает параллельный доступ к свойству. Этот дополнительный код блокирует семафор, затем получает или задает свойство, а затем разблокирует семафор. По сравнению с настройкой или получением примитивного значения или указателя блокировка и разблокировка семафора дорогостоящая (хотя, как правило, она незначительна, если вы рассматриваете общий поток вашего приложения).

Так как большинство ваших классов под iOS, особенно те, которые связаны с UI, будут использоваться в однопоточной среде, можно сбросить atomic (т.е. написать nonatomic, поскольку свойства atomic by default): даже если операция относительно недорогая, вы не хотите платить за то, что вам не нужно.

Ответ 2

см. разницу между атомным и неатомным в объекте c

Atomic

Atomic - поведение по умолчанию для свойства; не устанавливая указанное выше свойство как неатомное, оно будет атомарным.

Атомное свойство добавляет уровень безопасности потоков при получении или настройке значений. То есть, getter и setter для свойства всегда будут полностью завершены независимо от того, что делают другие потоки. Компромисс заключается в том, что эти свойства будут немного медленнее для доступа, чем неатомный эквивалент.

неатомарную

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

Ответ 3

@property (strong) NSString *str;

Atomic - поведение по умолчанию для свойства; не устанавливая указанное выше свойство как неатомное, оно будет атомарным.

setter и getter для этого свойства Atomic

-(NSString *) str{
@synchronized(self){
return str;
}}

-(void) setStr: (NSString *) newString {
@synchronized(self)  {
str = newString;
}}

Атомное свойство добавляет уровень безопасности потоков при получении или настройке значений. То есть, getter и setter для свойства всегда будут полностью завершены независимо от того, что делают другие потоки. эти свойства будут немного медленнее для доступа, чем неатомный эквивалент.

@property (strong,nonatomic) NSString *str;

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

setter и getter для этого свойства Nonatomic

-(NSString *) str{
    return str;
    }}

-(void) setStr: (NSString *) newString{
str = newString;
}

Итак, посмотрев методы сеттера и геттера для Атомного и неатомического, что неатомные методы очень легки.