2

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

有一个class_setWeakIvarLayout()似乎与此相关的函数被调用,但不幸的是,文档(对于这个函数和非弱对应)非常薄。

4

2 回答 2

9

You can achieve a zeroing weak reference using associative references with a container class. Basically:

  1. Your container class contains a single ivar, which is declared __weak id
  2. The associative reference 'setter' creates a conatiner, sets the __weak id ivar to point to your object, and then stores the container using objc_setAssociatedObjects(self,&key,container,OBJC_ASSOCIATION_RETAIN)
  3. Your getter retrieves the container using 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.
于 2012-09-05T02:37:34.310 回答
3

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

请参阅关联对象。它们提供了您想要的大部分,也许是全部(我不确定是否直接支持 zeroing-weak - 不,您需要找到替代解决方案)。

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


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

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

于 2012-07-21T18:07:38.830 回答