Говорят, что опция nonatomic
сделает ваш метод set быстрее. Я искал ее, но не мог понять. Может ли кто-нибудь сказать мне, почему?
Почему свойства всегда говорят, что они неатомичны в Objective C?
Ответ 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;
}
Итак, посмотрев методы сеттера и геттера для Атомного и неатомического, что неатомные методы очень легки.