NSOperation对象(线程环境)中的非原子属性,何时使用它?

时间:2009-05-08 21:43:21

标签: ios objective-c iphone multithreading cocoa-touch

我仍然在使用NSOperation在线程环境中工作,我有兴趣了解如果使用nonatomic属性,如果你是子类{{1 }}?

如果您的NSOperation设置为1,那么非原子的额外开销是否值得?如果每个操作队列执行多个线程,可能需要它吗?

感谢您提供解决方案,以便更好地在线程环境中理解此属性。

1 个答案:

答案 0 :(得分:5)

如果您有一个对象(或该对象的属性),您可以保证它不会同时从多个线程访问,那么您可以通过使用非原子来避免对该属性进行原子访问的潜在开销。在最简单的情况下,创建一个操作并将其排入NSOperationQueue,每个NSOperation实例将在调用线程中设置或在单个后台线程中运行;所以在任何时候,只有一个线程应该访问它。

非原子何时有用的更一般的问题部分取决于您是否在启用垃圾收集的情况下运行。根据Objective-C发行说明:

  

默认情况下,对属性的访问是原子的。对于几乎所有事情而言,这在GC下是微不足道的,并且除了对象和结构之外,在非GC下也是微不足道的。特别是在非GC条件下对保留对象的原子访问可能是昂贵的。因此,可以使用非原子属性。