哈希表中的ARC弱引用

3
我一直在使用NSHashTable来存储对象的弱引用。当哈希表中的对象被释放并且在哈希表中的引用被清零时,指向nil的指针仍然存在于哈希表中,是吗?因此,如果已释放的对象未直接从哈希表中删除,则随着时间的推移,哈希表的大小将继续增长?目前,没有简单的方法向控制哈希表的对象发送通知,说明其中一个哈希表元素已被删除(这是一个游戏,其中反馈调用意味着对象之间的通信非常间接,最好保持这种方式)。我应该定期遍历哈希表以删除nil引用吗?

我认为当对象被释放时,表格不应该增加大小。没有空指针会留在表格中,而是会被删除。这只是我的想法,关于它应该如何工作,我自己还没有尝试过。 - Tricertops
2个回答

8

这个问题几个月前就已经发布了,但是为了记录,NSHashTable确实会删除已释放的弱引用。所以回答实际问题,不,你不需要定期迭代哈希表。


8
注意:当弱引用失效时,NSHashTable.count不会被更新。如果您想检测空的NSHashTable,请使用(NSHashTable.anyObject == nil)。 - mrgrieves
@mrgrieves 但这没关系。哈希表就是这样工作的。它们会增长大小,但它们会使用那些nil值来存储插入到其中的新值。 - AdUki
@mrgrieves 谢谢!你刚刚救了我的一天! - Rudolf Adamkovič

1
我会创建一个管理类,负责添加和删除你所说的对象。因此,我将通过以下几种方式之一通知哈希表:
  • 直接通过方法调用(当哈希表由管理器引用时)
  • 间接地使哈希表成为管理器的委托对象
  • 通过在管理器中注册哈希表以观察任何添加/删除操作来进行间接处理
  • 通过让管理器向通知中心发送通知,该通知由哈希表监听来进行间接处理
这完全取决于如何将这些对象绑定在一起,以及哪种模型最适合实际设计。

太好了,谢谢。这些是不错的想法;我会考虑它们如何与我已有的东西相配。 - user26691

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接