【问题标题】:Why properties are always said to be made nonatomic in Objective C? [duplicate]为什么在Objective C中总是说属性是非原子的? [复制]
【发布时间】:2013-07-08 10:10:32
【问题描述】:

据说nonatomic选项会让你的setter方法跑得更快。我用谷歌搜索但无法理解。谁能告诉我为什么?

【问题讨论】:

标签: ios objective-c


【解决方案1】:

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

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

【讨论】:

  • 1+ 关于为 UI 属性删除原子属性是安全的部分,因为无论如何它都应该始终在主线程上更新
  • 您可能想澄清一下,为了“删除”atomic,您必须明确使用nonatomic,因为atomic 是属性的默认设置;如果你不指定任何东西,你会得到atomic
  • @Caleb 很棒的评论,谢谢!
【解决方案2】:

查看objective c中原子和非原子的区别

原子

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

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

非原子

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

【讨论】:

  • > '将确保当前进程由 cpu 完成,在另一个进程访问变量之前' 这是否意味着线程安全?
  • 我和@powerj1984有同样的问题
【解决方案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;

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

这些 Nonatomic 属性的 setter 和 getter

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

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

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

【讨论】:

  • 您的代码只能在 ARC 下运行。因为 ARC 保证对象分配的原子性,所以后一个示例实际上是原子的。请注意,NSString 属性应始终声明为 copy
猜你喜欢
  • 1970-01-01
  • 2015-12-15
  • 2010-10-23
  • 2012-04-09
  • 2021-08-14
  • 2011-05-03
  • 2012-12-25
  • 1970-01-01
  • 2017-02-21
相关资源
最近更新 更多