是否可以向使用运行时创建的类添加归零弱引用(在 ARC 意义上,而不是 GC)实例变量?如果有怎么办?
有一个class_setWeakIvarLayout()
似乎与此相关的函数被调用,但不幸的是,文档(对于这个函数和非弱对应)非常薄。
是否可以向使用运行时创建的类添加归零弱引用(在 ARC 意义上,而不是 GC)实例变量?如果有怎么办?
有一个class_setWeakIvarLayout()
似乎与此相关的函数被调用,但不幸的是,文档(对于这个函数和非弱对应)非常薄。
You can achieve a zeroing weak reference using associative references with a container class. Basically:
__weak id
__weak id
ivar to point to your object, and then stores the container using objc_setAssociatedObjects(self,&key,container,OBJC_ASSOCIATION_RETAIN)
objc_getAssociatedObject(self, &key)
and returns the __weak id
ivar. If your object has been dealloc
'ed, the __weak id ivar
of the container will be zero.class_setWeakIvarLayout()
在GC下使用。我不确定它是否在 ARC 下使用。在任何情况下,您都不能在运行时更改类的布局,包括添加任意实例变量(尽管由于现代运行时,您可以将 ivars 添加到类并重新编译而无需重新编译子类)。
请参阅关联对象。它们提供了您想要的大部分,也许是全部(我不确定是否直接支持 zeroing-weak - 不,您需要找到替代解决方案)。
啊——好的。感谢您的澄清。我不确定您是否可以通过 API 动态设置弱调零 ARC 行为。不过,运行时和编译器的源代码是可用的。
请注意,您可以很容易地在非 ARC 环境下伪造归零弱,方法是设置一个实现 -dealloc 的类来执行您需要的任何清理,将实例与需要在释放时触发所述清理的对象相关联,并确保没有其他东西保留该对象具有自定义 -dealloc 通知挂钩。它有点脆弱,但它有效。