2015-03-03 113 views
1

我正在重读"Transitioning to ARC Release Notes"为什么在ARC支持平台中不能支持弱引用?

在开始的时候,它说

ARC是在Xcode 4.2支持OS X v10.6中和v10.7(64位 应用)和为iOS 4和iOS 5.弱引用是不支持OS X v10.6和iOS 4中的 。

这是为什么?实施薄弱的参考需要深入的平台/操作系统支持吗?

我想,弱引用不是那么特别(考虑到C++原始指针的用法)。

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

回答

5

弱引用是自我调零。在指向的对象开始其dealloc之前,它们被设置为nil,并且任何试图将处于释放中的对象分配给weak引用引发异常。因此,运行时需要能够存储一个附加映射:从对象到对该对象的任何弱引用。 iOS 4没有实现该表。

它们和C++的weak_ptr之间的主要实现区别在于没有转换步骤,因为转换为shared_ptr。推动nil ing,而不是拉动。引用只能在机器级别作为常规指针加载。

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

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

+0

我不知道。太奇妙了!! – 9dan 2015-03-03 04:30:17

1

弱属性是'归零弱引用',这意味着当对象被解除分配时,对该对象的所有弱引用自动地为nil。在iOS5之前,对于实现这项工作所需的对Objective C运行时所做的更改尚未引入。 ARC被允许在iOS4中使用unsafe_unretained来代替弱点,如果它们指向的对象被释放,可能会变成悬挂指针。