2013-07-03 37 views
0

我有一個名爲selectedUsers的NSMutableArray,我使用名爲addUser的方法添加對象。被添加的對象通常是PLManagedUser類型(核心數據管理對象),但有時對象可能是字符串。在任何情況下,如果數組已經包含對象,我不想將它添加到數組中。下面是代碼:NSArray containsObject方法不一致的結果

- (void)addUser:(id)user withTitle:(NSString *)title { 

    if (![_selectedUsers containsObject:user]) { 
     [_selectedUsers addObject:user]; 
    } 
} 

我注意到,如果我嘗試添加相同的用戶回用上述方法來備份,在containsObject捕獲它,並且不添加重複。但是,如果在添加其他對象之後添加相同的用戶(具有相同的內存地址),則會添加重複項。

我打印數組的內容,每次我添加一些內容以確認重複的對象在數組中。

我的問題是,有什麼明顯的原因,爲什麼containsObject不一致在這裏工作?

+4

'PLManagedUser'是否實現'isEqual:'和'hash'方法? – trojanfoe

+0

我應該補充說我正在調試我沒有寫的代碼 - 我怎麼知道這個?它繼承自NSObject,所以我會這麼認爲? – jac300

+0

默認情況下'isEqual:'方法只會進行指針檢查;但這不符合你的問題中的陳述,所以也許更深層的事情正在發生。 – trojanfoe

回答

3

您需要提供對象識別自己等同於同一類別的另一個對象的能力,並且要執行此操作,請執行isEqual:hash方法。

話雖如此,你的問題的解釋是對面我所期望的

+1

我敢打賭,將'isEqual:'和'hash'添加到'NSManagedObject'子類是一件非常糟糕的事情。被管理對象IIRC嚴格按照「NSManagedObjectID」來定義平等。 – bbum

+0

@bbum所以你如何有效地存儲集合類中的託管對象? – trojanfoe

+1

添加他們並刪除他們像平常一樣,只是不重新定義他們的平等定義。雖然,一般來說,人們使用各種各樣的集合集合*,而不是由CD管理來存儲CD託管對象,這是一種代碼味道;它表明模型層並不真正捕獲應用程序的完整狀態。 – bbum