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