Objective-C 中的弱键字典
-
09-09-2019 - |
题
我想知道是否有可能有类似于 ActionScript 3 的东西 Dictionary
Objective-C 中具有弱键的对象。我希望能够将类的实例“附加”到其他任意实例。
例子;
MetaData *meta = [MetaData metaDataForObject:someObject];
meta.whatever = foo;
然后:
foo = [MetaData metaDataForObject:someObject].whatever;
[foo doStuff];
棘手的部分是在引用的对象之后 someObject
已释放,我想要引用的对象 meta
被释放(并释放,假设没有客户端代码保留它)。
可能的?我看了一下 +[NSValue valueWithNonretainedObject:]
但我不确定这是否是我想要的,因为当我稍后查询时 -[NSValue nonretainedObjectValue]
看起来我会得到一个指向垃圾的指针(当对象被释放时,NSValue 如何将指针归零?)。
谢谢,
本杰明
2011 年 9 月 23 日更新: 我相信做到这一点的方法是 objc_setAssociatedObject
及相关功能。请参阅 Objective-C 运行时参考.
解决方案
这听起来像你问的是反应要弱引用的实例变量被释放的能力。你当然可以使用__weak
属性(启用GC)来创建弱引用,但没有内置的机制后,其目标是GCed赶上当这样的属性被归零。
如果你真的想这样,最好的办法是使用苹果的键 - 值观察使用相同的机制:方法交叉混合。维护一个全局表(如NSHashMap
或NSMapTable
)对象映射到其对应的元数据对象,然后替换类,你要附加到与版本的对象dealloc
/ finalize
中的方法查找对应的元数据对象的表并发送消息将其摧毁。 (您还需要映射类到原来的dealloc
/ finalize
方法的另一个表或两个。) JRSwizzle 提供了一个很好的界面到混写。
如果你想成为真正看中的不是覆盖目标类的所有对象的dealloc
/ finalize
,你可以创建一个代理类,并重新分配isa
指针只是类,例如,有没有性能击中释放了你不看对象。 (KVO这样做,太。)
其他提示
您是否在寻找 NSHashMap 吧?它不归零的引用。