【问题标题】: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_ptrniling 被推送,而不是被拉取。引用可以作为机器级别的常规指针加载。

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

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

    【讨论】:

    • 我不知道。太棒了!!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-10-21
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2019-06-25
      相关资源
      最近更新 更多