【问题标题】:Why weak reference couldn't be supported in ARC enabled platform?为什么启用 ARC 的平台不支持弱引用?
【发布时间】:2015-03-03 03:51:37
【问题描述】:
我现在正在重读"Transitioning to ARC Release Notes"。
一开始是这样说的
适用于 OS X v10.6 和 v10.7(64 位)的 Xcode 4.2 支持 ARC
应用程序)和 iOS 4 和 iOS 5。弱引用不是
在 OS X v10.6 和 iOS 4 中受支持。
这是为什么?实现弱引用是否需要深入的平台/操作系统支持?
我认为,弱引用并没有那么特别(考虑到 C++ 原始指针的用法)。
难道不是技术原因? (弱参考支持被放弃了,因为它失败了一些测试用例并且他们没有足够的时间?)
【问题讨论】:
标签:
objective-c
xcode
pointers
automatic-ref-counting
【解决方案1】:
弱引用是自归零的。它们在指向的对象开始其dealloc 之前立即设置为nil,并且任何尝试将正在解除分配到weak 引用的对象分配的尝试都会引发异常。因此,运行时需要能够存储附加映射:从对象到对该对象的任何弱引用。 iOS 4 没有实现该表。
它们与 C++ 的weak_ptr 之间的主要实现区别在于没有转换步骤,根据转换为shared_ptr。 niling 被推送,而不是被拉取。引用可以作为机器级别的常规指针加载。
Objective-C 运行时必须扩展来处理这个问题的部分原因是 Objective-C 对象通常不能存在于堆栈上。因此,自动跟踪它们需要编译器和运行时之间更大的阴谋。与 STL 不同,您不会首先看到 ARC 作为第三方解决方案出现。
实际上,它只是一些未实现的额外 C 调用。编译器支持到位,如果您真的需要并支持 iOS 4 及更早版本下的弱引用,您可以自己实现它们。迈克·阿什做到了。 Apple 的决定很可能与其对向后支持开发技术的一般态度有关:它宁愿每个人都使用最新的。
【解决方案2】:
弱属性是“归零弱引用”,这意味着当对象被释放时,对该对象的所有弱引用都会自动成为nil。直到 iOS5 才引入了使这项工作所需的对 Objective C 运行时的更改。 ARC 被允许在 iOS4 中使用unsafe_unretained 代替weak,如果它们指向的对象被释放,它可能成为悬空指针。