3

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

例子;

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 运行时参考

4

2 回答 2

4

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

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

如果您想要真正花哨,而不是覆盖目标类的所有对象的dealloc/ ,您可以创建一个代理类并仅为该类重新分配指针,这样就不会对您的对象的释放造成性能影响'不看。(KVO 也这样做。)finalizeisa

于 2009-04-10T03:08:29.210 回答
1

您是否正在寻找NSHashMap?它对引用进行归零。

于 2009-04-09T19:54:20.410 回答