为什么在Objective C中总是说属性是非原子的?

时间:2013-07-10 13:02:05

标签: ios objective-c

据说nonatomic选项会让您的 setter方法运行得更快。我用谷歌搜索但无法理解。有人可以告诉我为什么吗?

3 个答案:

答案 0 :(得分:53)

声明属性atomic会使编译器生成其他代码,以防止对属性进行并发访问。此附加代码锁定信号量,然后获取或设置属性,然后解锁信号量。与设置或获取原始值或指针相比,锁定和解锁信号量非常昂贵(尽管如果考虑应用程序的整体流量,通常可以忽略不计)。

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

答案 1 :(得分:7)

查看目标c中原子与非原子之间的差异

<强>原子

Atomic是属性的默认行为;通过不明确地将上述属性设置为非原子属性,它将是原子的。

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

<强>非原子

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

答案 2 :(得分:3)

@property (strong) NSString *str;

Atomic 是属性的默认行为;通过不明确地将上述属性设置为非原子属性,它将是原子的。

setter&amp;这些原子属性的吸气剂

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

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

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

@property (strong,nonatomic) NSString *str;

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

setter&amp;这些 Nonatomic 属性

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

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

所以通过查看二传手和 Atomic&amp; amp; getter方法nonatomic 非原子方法非常轻。