3

我已经使用NSHashTable来存储对对象的弱引用。当散列表中的对象被释放并且散列表中的引用被置零时,指向nil的指针仍驻留在散列表中,是否正确?那么随着时间的推移,如果没有直接从哈希表中删除对象,哈希表将会继续增大?现在,没有简单的方法可以向控制散列表的对象发送通知,以便其中一个散列表元素已被删除(这是一个反馈调用意味着对象间通信非常间接的游戏,并且最好保持这种状态) 。我是否应该定期遍历散列表以删除无引用?哈希表中的弱引用

+0

我不认为当对象被释放时表格的大小应该增大。没有空指针会留在表中,但它们将被删除。 _这些只是我的想法,它应该如何工作,并没有自己尝试._ – Tricertops 2013-04-03 19:23:43

回答

7

这个问题发布几个月前,但记录,NSHashTable 确实删除发布的弱引用。因此,要回答实际问题,不,您不需要定期迭代散列表。

+8

注意:当弱引用关闭时,NSHashTable.count不会更新。如果你想检测一个空的NSHashTable,使用(NSHashTable.anyObject == nil)。 – mrgrieves 2014-07-09 21:53:09

+0

@mrgrieves但是,这是好的。哈希表就是这样工作的。它们的大小会增加,但它们会将这些零值用于插入到它们中的新值。 – AdUki 2014-08-15 07:11:10

+0

@mrgrieves谢谢!你刚刚救了我的一天! – 2016-02-02 10:24:53

1

我会做一个经理类负责添加和删除你说的对象。因此,我会通知哈希表以几种方式中的一种:直接通过方法调用(当哈希表由管理器引用)

  • 间接使哈希表管理者的委托对象
  • 间接注册散列表

    • 观察到任何加/通过使管理器发送通知到通知中心,其通知由哈希表听取在管理器中删除的操作
    • 间接

    这一切都取决于你如何将这些对象绑定在一起,哪些模型适合最实际的设计。

  • +0

    太好了,谢谢。那些是好主意;我会考虑他们如何适合我所拥有的。 – user26691 2013-04-03 19:06:34