2011-12-25 131 views
3

我使用的Xcode 4.2去除對象的時候,並通過這本書去那不叫「編程在Objective C 2.0」重寫isEqual:方法方法,但是從陣列

有是涉及從實現isEqual:方法練習類NSObject

該書說isEqual:方法是在調用NSArray類的removeObjectIdenticalTo:方法時觸發的。 removeObjectIdenticalTo:最終將isEqual:消息發送給所有陣列成員。

當我想在我AddressCard類以實現此isEqual:方法,我用removeObjectIdenticalTo:,傳遞一個對象,它是AddressCard類的實例,但是,我的isEqual:方法不獲取調用。雖然如果我只是明確地在AddressCard的實例上使用isEqual:方法,它確實有效。

這是我從AddressCard.m文件

-(BOOL)isEqual: (id)object { 
    NSLog(@"I got called"); 
    return NO; 
} 

isEqual:方法當此代碼AddressBook.m

-(void) removeCard: (AddressCard *) theCard { 
    [book removeObjectIdenticalTo: theCard]; 
} 

上面列出的isEqual:方法不叫被激發。

我覺得我錯過了一些重要的東西,但是從我看過的所有內容中我都知道,我認爲isEqual:必須被調用,除非removeObjectIdenticalTo:不再涉及它。

我也在.h文件中定義了所有相應的方法。

回答

6

這聽起來像書是錯誤的。

NSMutableArray和其他集合有一些類似的方法對,如removeObject:removeObjectIdenticalTo:,它們的含義有很大的不同。

第一個測試集合中對象的是否與傳入對象的值相同。爲此,數組中的每個對象都調用isEqual:。這就允許每個班級爲自己定義與其他對象「平等」的含義,就像你正在爲你的班級做的那樣。約removeObject:細節可以在its documentation找到:

此方法使用indexOfObject:定位匹配[...]因此,匹配被一個對象的對isEqual:消息響應的基礎上確定的。

...IdenticalTo:方法處理對象的內存中的實際身份。他們檢查傳入對象的地址是否與集合中的任何地址相同。數組可以在不調用該對象的任何方法的情況下找到該對象的地址;這裏不使用isEqual:。再次,這是在docs指出:

此方法使用indexOfObjectIdenticalTo:方法來定位匹配[...]因此,匹配確定使用對象地址。

一般來說,你會希望removeObject:往往比removeObjectIdenticalTo:得多,因爲它的意義要執行的操作最匹配:選擇其是一樣的供給對象的對象。

8

正如你所猜測的,removeObjectIdenticalTo:不會調用isEqual:,因爲它只是使用對象地址來檢查相等性。

但是removeObject:調用isEqual:,所以你很可能會想要。

+0

非常感謝。有沒有removeObjectIdenticalTo方法列表的地方?因爲我只能跳轉到.h定義文件。 – Evgenius 2011-12-25 07:10:43