我想知道是否有可能有类似于 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赶上当这样的属性被归零。

如果你真的想这样,最好的办法是使用苹果的键 - 值观察使用相同的机制:方法交叉混合。维护一个全局表(如NSHashMapNSMapTable)对象映射到其对应的元数据对象,然后替换类,你要附加到与版本的对象dealloc / finalize中的方法查找对应的元数据对象的表并发送消息将其摧毁。 (您还需要映射类到原来的dealloc / finalize方法的另一个表或两个。) JRSwizzle 提供了一个很好的界面到混写。

如果你想成为真正看中的不是覆盖目标类的所有对象的dealloc / finalize,你可以创建一个代理类,并重新分配isa指针只是类,例如,有没有性能击中释放了你不看对象。 (KVO这样做,太。)

其他提示

您是否在寻找 NSHashMap 吧?它不归零的引用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top