是否可以将归零弱ref(在ARC意义上,而不是GC)实例变量添加到使用运行时创建的类中?如果是,怎么办?
有一个名为class_setWeakIvarLayout()
的函数似乎与此有关,但遗憾的是,文档(包括该函数和非弱对应函数)非常精简。
您可以使用容器类的关联引用来实现归零弱引用。基本上:
- 容器类包含一个ivar,声明为
__weak id
- 关联引用"setter"创建一个conatiner,将
__weak id
ivar设置为指向对象,然后使用objc_setAssociatedObjects(self,&key,container,OBJC_ASSOCIATION_RETAIN)
存储容器 - 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通知挂钩的对象,您可以很容易地伪造弱归零。它有点脆弱,但它有效。