为什么启用ARC的平台无法支持弱引用?

时间:2015-03-03 03:51:37

标签: objective-c xcode pointers automatic-ref-counting

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

一开始,它说

  

Xcode 4.2支持OS for OS X v10.6和v10.7(64位   应用程序)和iOS 4和iOS 5.弱引用不是   在OS X v10.6和iOS 4中受支持。

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

弱属性是'归零弱引用',这意味着当对象被释放时,对该对象的所有弱引用都将自动nil。直到iOS5才引入了使这项工作所需的Objective C运行时的更改。允许ARC在iOS4中使用unsafe_unretained来代替弱点,如果它们指向的对象被释放,它可能成为悬空指针。