使用运行时向Objective-C类添加弱ivar



是否可以将归零弱ref(在ARC意义上,而不是GC)实例变量添加到使用运行时创建的类中?如果是,怎么办?

有一个名为class_setWeakIvarLayout()的函数似乎与此有关,但遗憾的是,文档(包括该函数和非弱对应函数)非常精简。

您可以使用容器类的关联引用来实现归零弱引用。基本上:

  1. 容器类包含一个ivar,声明为__weak id
  2. 关联引用"setter"创建一个conatiner,将__weak id ivar设置为指向对象,然后使用objc_setAssociatedObjects(self,&key,container,OBJC_ASSOCIATION_RETAIN)存储容器
  3. getter使用objc_getAssociatedObject(self, &key)检索容器并返回__weak id ivar。如果您的对象已被dealloc'ed,则容器的__weak id ivar将为零

class_setWeakIvarLayout()在GC下使用。我不确定它是否在ARC下使用。在任何情况下,您都不能在运行时更改类的布局,包括添加任意实例变量(尽管由于现代运行时,您可以向类添加ivar并在不重新编译子类的情况下重新编译)。

请参见关联对象。它们提供了你想要的大部分,也许是全部(我不确定是否直接支持弱归零——不是,你需要找到一个替代解决方案)。

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocAssociativeReferences.html


啊——好的。谢谢你的澄清。我不确定您是否可以通过API动态设置弱ARC行为。不过,运行时和编译器的源代码是可用的。

请注意,在非ARC环境下,通过设置一个实现-dealloc的类来执行所需的任何清理,将实例与需要在解除分配时触发所述清理的对象相关联,并确保没有其他东西保留具有自定义-dealloc通知挂钩的对象,您可以很容易地伪造弱归零。它有点脆弱,但它有效。

相关内容

  • 没有找到相关文章

最新更新