gpt4 book ai didi

objective-c - Objective-C 中的弱键字典

转载 作者:搜寻专家 更新时间:2023-10-30 20:04:59 29 4
gpt4 key购买 nike

我想知道是否有可能在 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 Runtime Reference .

最佳答案

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

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

如果你想非常花哨,而不是覆盖目标类的所有对象的dealloc/finalize,你可以创建一个代理类并重新分配isa 指针仅指向该类,这样就不会对您不关注的对象的释放性能造成影响。 (KVO 也这样做。)

关于objective-c - Objective-C 中的弱键字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/735551/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com