为什么支持 ARC 的平台不支持弱引用?

Why weak reference couldn't be supported in ARC enabled platform?

我正在重读"Transitioning to ARC Release Notes"

开头写着

ARC is supported in Xcode 4.2 for OS X v10.6 and v10.7 (64-bit applications) and for iOS 4 and iOS 5. Weak references are not supported in OS X v10.6 and iOS 4.

这是为什么?实施弱引用是否需要深入 platform/OS 支持?

我认为,弱引用并没有那么特殊(考虑到 C++ 原始指针的用法)。

难道不是技术原因? (弱引用支持被删除是因为它失败了一些测试用例并且他们没有足够的时间?)

弱属性是 'Zeroing Weak References',这意味着当对象被释放时,对该对象的所有弱引用都会自动 nil。直到 iOS5 才引入对 Objective C 运行时进行必要的更改以完成此工作。 ARC 被允许在 iOS4 中使用 unsafe_unretained 代替 weak,如果它们指向的对象被释放,它可能会变成悬挂指针。

弱引用是自归零。在指向的对象开始其 dealloc 之前,它们被设置为 nil 并且任何尝试将正在解除分配的对象分配给 weak 引用都会引发异常。因此,运行时需要能够存储附加映射:从对象到对该对象的任何弱引用。 iOS 4 没有实现 table.

它们与 C++ 的 weak_ptr 之间的主要实现区别是没有转换步骤,根据转换为 shared_ptrniling 被推,而不是被拉。引用可以作为机器级别的常规指针加载。

必须扩展 Objective-C 运行时来处理此问题的部分原因是 Objective-C 对象通常不能存在于堆栈中。因此自动跟踪它们需要编译器和运行时之间更大的阴谋。与 STL 不同,您不会看到 ARC 作为第三方解决方案首先出现。

实际上只是一些额外的 C 调用没有实现。编译器支持到位,如果你真的想要并支持 iOS 4 及更早版本下的弱引用,你可以自己实现它们。迈克·阿什做到了。 Apple 的决定可能与其对开发技术向后支持的总体态度有很大关系:它宁愿每个人都使用最新的。