2009-06-09 45 views
1

我的設置簡短說明:我應該如何爲存儲SQL對象的NSMutableSet實現Hash?

有一個SQLObject基類有一個整數rowId

return [[self class] hash]^self.rowId; 

所有對象都存儲在一個NSMutableSet所以,如果他們從要求:

return [self isKindOfClass:[otherObject class]] && self.rowId == otherObject.rowId; 

它用它的ROWID異或它的類實現哈希:它通過比較同類產品和它的rowId實現isEqual數據庫再次使用同一個對象,而不是創建一個新對象。當釋放SQLObject時,它會檢查retainCount是否恰好爲1,如果是,則將其從集中刪除,從而取消分配。

問題是,它試圖從集合中刪除它時找不到該對象。顯然,rowId不會改變,類也不會改變,因此散列和isEqual都不會在整個對象的生命中發生變化。這是怎麼回事?有人有任何想法,爲什麼它可能沒有找到它?

如果我將集合更改爲NSMutableArray,它會找到它。

+0

我想看看你的代碼在NSMutableSet中添加和測試成員資格。 – 2009-08-16 12:53:04

回答

0

我從來沒有想出一個很好的解決方案。相反,我想出了一些不同的方法:

每個SQL對象子類都有它自己的NSDictionary。關鍵是對象的rowId的NSNumber,並且該值是到SQL對象的薄弱鏈接。當SQL對象被釋放時,其弱鏈接將從字典中移除。

相關問題