在 Objective-C(和 Swift)中,弱属性线程安全吗?

Joh*_*ell 3 weak-references objective-c thread-safety swift

当它们因为最后一个强引用消失而被清除时,如果这发生在另一个线程上,你会遇到问题吗?如果是这样,使用 atomic 是否正确?既然我相信 Swift 没有原子,那么那里的线程安全弱属性需要什么?

Rob*_*ier 5

weak是 ARC 的一部分,并且 Clang 承诺按照您描述的方式是原子的。请特别参阅Clang 的自动引用计数文档中的第4.2语义

对此特别感兴趣的是这些部分(强调):

对于 __weak 对象,当前指针被保留,然后在当前完整表达式结束时释放。这必须相对于赋值和指针对象的最终释放以原子方式执行。

任务

对于 __weak 对象,左值会更新为指向新的指针对象,除非新的指针对象是当前正在释放的对象,在这种情况下,左值会更新为空指针。这必须相对于对对象的其他分配、从对象读取以及对新指针的最终释放以原子方式执行。

请注意,许多其他操作不是原子操作,尤其是强赋值(例如,在两个不同的线程上分配强属性)。但是保留计数本身是线程安全的,这确实是您在这里担心的部分。您可以在任何线程上自由保留和释放对象,并且最后的保留计数将是正确的,包括由于weak分配而导致的“隐式”释放。这是以下所有直接结果:

所有这一切的结果是,与 Cocoa 的大多数部分不同,引用计数几乎总是可以跨线程安全地处理。

  • 与往常一样,请注意“线程安全”是指是否在多线程情况下定义行为。它不保证多线程情况下的“数据完整性”。 (3认同)