14

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

4

3 回答 3

55

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

由于你在 iOS 下的大部分类,尤其是与 UI 相关的类,都会在单线程环境中使用,所以丢弃是安全的atomic(即 write nonatomic,因为属性是atomic默认的):即使操作相对便宜,你不想为不需要的东西买单。

于 2013-07-10T13:08:50.937 回答
7

查看目标 c 中原子和非原子之间的区别

原子

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

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

非原子

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

于 2013-07-10T13:09:53.280 回答
3
@property (strong) NSString *str;

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

这些Atomic属性的 setter 和 getter

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

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

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

@property (strong,nonatomic) NSString *str;

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

这些非原子属性的 setter 和 getter

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

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

因此,通过查看Atomic 和 nonatomic的 setter 和 getter 方法,非原子方法的重量非常轻。

于 2013-07-10T13:24:58.913 回答