关于IOS:为什么在C中总是说属性是 nonatomic的?

Why properties are always said to be made nonatomic in Objective C?

本问题已经有最佳答案,请猛点这里访问。

据说nonatomic选项将使setter方法运行得更快。我在谷歌上搜索了一下,但无法理解。有人能告诉我为什么吗?


声明属性atomic使编译器生成额外的代码,以防止对该属性的并发访问。这个额外的代码锁定信号量,然后获取或设置属性,然后解锁信号量。与设置或获取原语值或指针相比,锁定和解锁信号量的成本很高(尽管考虑到应用程序的整体流程,通常可以忽略不计)。

由于大多数IOS下的类,特别是与UI相关的类,将在单线程环境中使用,因此可以安全地删除atomic(即写入nonatomic,因为默认情况下属性是atomic):即使操作相对便宜,您也不想为不需要的东西付费。


见目标C中原子与非原子的区别

原子的

原子属性是属性的默认行为;如果不将上述属性显式设置为非原子属性,它将是原子属性。

原子属性在获取或设置值时添加线程安全级别。也就是说,无论其他线程在做什么,属性的getter和setter都将始终完全完成。权衡的是,这些属性的访问速度要比非原子等效属性慢一些。

非原子的

非原子属性不是线程安全的,将直接返回其属性。这将比原子性质更快,但如果不采取预防措施,显然会带来一些风险。


1
@property (strong) NSString *str;

原子属性是属性的默认行为;如果不将上述属性显式设置为非原子属性,它将是原子属性。

这些原子属性的setter&getter

1
2
3
4
5
6
7
8
9
-(NSString *) str{
@synchronized(self){
return str;
}}

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

原子属性在获取或设置值时添加线程安全级别。也就是说,无论其他线程在做什么,属性的getter和setter都将始终完全完成。与非原子等效物相比,这些属性的访问速度要慢一些。

1
@property (strong,nonatomic) NSString *str;

非原子属性不是线程安全的,将直接返回其属性。这将比原子性质更快,但如果不采取预防措施,显然会带来一些风险。

这些非原子属性的setter和getter

1
2
3
4
5
6
7
-(NSString *) str{
    return str;
    }}

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

因此,通过研究原子和非原子的setter&getter方法,非原子方法非常轻。