PLWeakCompatibility 0.0.1

PLWeakCompatibility 0.0.1

测试已测试
语言语言 Obj-CObjective C
许可 BSD
发布最新发布2014年12月

未标明 维护。



  • Plausible Labs Cooperative

你喜欢 ARC 但需要支持旧操作系统吗?你考虑过仅仅为了能够使用 __weak 就取消对 macOS 10.6 或 iOS 4 的支持吗?好消息是!现在,你只需将一个文件放入你的项目中,并添加几个编译器标志,就可以在旧操作系统上使用 __weak

PLWeakCompatibility 是一组存根,它实现了编译器用于使 __weak 工作的 Objective-C 运行时函数。如果它们存在(即你的应用正在 iOS5+ 或 macOS 10.7+ 上运行),则它自动调用到真实的运行时函数,如果它们不存在,则使用它自己的实现。

要使用 PLWeakCompatibility

  1. PLWeakCompatibilityStubs.m 放入你的项目中。
  2. 将以下标志添加到你的 Xcode 目标设置中的其他 C 标志中: -Xclang -fobjc-runtime-has-weak
  3. 第三步不存在!

请注意,默认情况下,如果存在 MAZeroingWeakRef,则 PLWeakCompatibility 使用 MAZeroingWeakRef 来处理 __weak 如果 MAZeroingWeakRef 存在。如果不存在,则使用其自己的、不那么复杂的内部实现。如果你已经在使用 MAZeroingWeakRef,则 PLWeakCompatibility 将利用它。如果你没有,则不需要它。你不需要做任何事情来启用对 MAZeroingWeakRef 的使用,如果它在你的项目中存在,它将简单地被使用。

实现说明

内置弱引用实现是基本的但足够使用的。它通过直接将目标类的 -release-dealloc 方法进行交换来实现。这意味着任何弱引用类实例的操作都会对性能造成影响,即使这些实例本身没有被弱引用。

这种交换应该是无害的,但就像所有运行时操作一样,可能会出现问题。特别是,我预计弱引用与桥接 CoreFoundation 对象将完全不能工作,并且可能与键值观察发生冲突。好消息是,由于 PLWeakCompatibility 的实现只在旧操作系统上激活,你有稳定的测试目标,并且可以知道未来的更新不会影响兼容性。

兼容性说明

PLWeakCompatibility 应该 与任何支持 ARC 的操作系统/架构/编译器组合完全兼容。由于调用是在编译时生成的,并且存根只是在可用时调用苹果的实现,因此极不可能因为未来操作系统的更新而破坏使用 PLWeakCompatibility 的应用程序。所有棘手的事情都发生在不会接收进一步更新的操作系统上。

未来版本的 Xcode 可能会包含不支持这些存根的编译器。我们认为这种可能性不大,但在理论上是有可能的。如果发生这种情况,您可以在支持 iOS 4 或 Mac OS 10.6 期间继续使用旧编译器进行构建,我们也在不排除这种可能性发生的情况下,尽力解决任何不兼容问题。