Objective-C中的弱键字典

时间:2009-04-09 19:17:21

标签: objective-c dictionary weak-references

我想知道在Objective-C中是否可以使用弱键的ActionScript 3的Dictionary对象。我希望能够将一个类的实例“附加”到其他任意实例。

实施例

MetaData *meta = [MetaData metaDataForObject:someObject];
meta.whatever = foo;

后来:

foo = [MetaData metaDataForObject:someObject].whatever;
[foo doStuff];

棘手的部分是,在someObject被引用的对象被释放后,我希望释放meta引用的对象(并且dealloc'd,假设没有客户端代码保留它)。

可能?我看了+[NSValue valueWithNonretainedObject:],但我不确定这是否是我想要的,因为当我后来查询-[NSValue nonretainedObjectValue]时,似乎我会得到一个指向垃圾的指针(NSValue如何将指针归零)当对象被dealloc'd?)。

谢谢,

本杰明

2011年9月23日更新:我相信这样做的方法是使用objc_setAssociatedObject及相关功能。请参阅Objective-C Runtime Reference

2 个答案:

答案 0 :(得分:4)

听起来你要求的是能够对被释放的弱引用实例变量做出反应。您当然可以使用__weak属性(启用GC)来创建弱引用,但是没有内置机制来捕获何时在其目标为GC之后归零这样的属性。

如果你真的想要这个,最好的办法就是使用Apple的Key-Value Observing使用的相同机制:方法调配。维护一个全局表(例如NSHashMapNSMapTable)映射对象到其对应的元数据对象,然后替换对象类中的dealloc / finalize方法'附加到查找表中相应元数据对象的版本并发送消息以将其拆除。 (您还需要另外一两个表,将类映射到原始的dealloc / finalize方法。)JRSwizzle为调配提供了一个很好的界面。

如果你想真正喜欢它,而不是覆盖目标类的所有对象的dealloc / finalize,你可以创建一个代理类并重新分配isa指针对于那个类来说,对于你没有观看的对象的重新分配没有性能损失。 (KVO也这样做。)

答案 1 :(得分:1)

你是在寻找NSHashMap吗?它确实将引用归零。