【发布时间】:2014-08-01 05:02:41
【问题描述】:
在 Objective-C 中,您可以区分原子属性和非原子属性:
@property (nonatomic, strong) NSObject *nonatomicObject;
@property (atomic, strong) NSObject *atomicObject;
据我了解,您可以安全地从多个线程读取和写入定义为原子的属性,而同时从多个线程写入和访问非原子属性或 ivars 可能会导致未定义的行为,包括错误的访问错误。
所以如果你在 Swift 中有这样的变量:
var object: NSObject
我可以安全地并行读写这个变量吗? (不考虑这样做的实际意义)。
【问题讨论】:
-
我想在未来,也许我们可以使用
@atomic或@nonatomic。或者默认情况下只是原子的。 (Swift 太不完整了,我们现在不能说太多) -
IMO,默认情况下他们会让所有东西都变成非原子的,并且可能会提供一个特殊的功能来制作原子的东西。
-
顺便说一句,
atomic通常被认为不足以与属性进行线程安全交互,除了简单的数据类型。对于对象,通常使用锁(例如,NSLock或@synchronized)或 GCD 队列(例如,具有“读写器”模式的串行队列或并发队列)跨线程同步访问。 -
@Rob,是的,尽管由于 Objective-C(可能在 Swift 中)中的引用计数,在没有原子访问的情况下并发读取和写入变量可能会导致内存损坏。如果所有变量都具有原子访问权限,那么可能发生的最糟糕的事情将是“逻辑”竞争条件,即意外行为。
-
不要误会我的意思:我希望 Apple 回答/解决原子行为问题。只是(a)
atomic不能确保对象的线程安全; (b) 如果正确使用上述同步技术之一来确保线程安全(除其他外,防止同时读/写),那么原子问题就没有实际意义。但是对于简单的数据类型,我们仍然需要/想要它,atomic具有真正的价值。好问题!
标签: objective-c swift