==的定義是正確的,它會檢查他們正在指向實際相同的指針/內存地址(即0xffffff
)
關鍵,理解你問是要考慮「平等」一詞的含義。從開發人員的角度來看,「平等」通常意味着「這兩個對象在我實際需要的字段中包含相同的數據」。你可以有兩個user
對象,每個對象具有相同的userID
屬性,但lastUpdated
中的不同時間 - 你認爲它們是否相等?取決於你的用例。很可能你會說是,因爲他們是同一個用戶。它們在不同的時間從服務器更新,所以有些字段不同,但爲了實現,它們是平等的。
在上面的情況下,他們是同一個對象嗎?當然不。他們指向不同的內存地址。所以==
會NO
,而如果你寫你的isEqual:
方法來檢查只是userID
屬性,它會返回YES
的isEqual:
的定義是完全由類的作者。如果需要,可以使用isEqual:
來使用==
。在你的班級中,你所要做的就是覆蓋NSObject
協議定義的isEqual:
方法。
如果您有自定義對象,請使用isEqual:
來定義您定義的等於的內容。在用戶對象的例子,你可以定義:
- (BOOL)isEqual:(id)otherObject {
if ([otherObject isKindOfClass:[self class]]) {
MyClass *otherObjectAfterCast = (MyClass*)otherObject;
if ([otherObjectAfterCast.userID isEqualToString:self.userID])
return YES;
}
return NO;
}
從技術上講,你可能想使用caseInsensitiveCompare:
或類似的東西,但你的漂移......
isEqual:
也可以用於觸發其它方法 - 在NSString
的情況下 - 調用isEqual:
當兩個操作數都是字符串導致調用isEqualToString:
- 這就是爲什麼文檔建議呼籲isEqualToString:
如果你知道他們是兩個字符串,因爲它是一個快一點。
因此,isEqual:
是你所做的任何事情,或者無論類作者如何定義它。
這也是該文檔存在相當清晰的定義(一次笑):NSObject Protocol Reference
希望這有助於!讓我知道你是否需要進一步澄清。
不。大多數語言的isEqual契約擴展到特定對象的方面,而不是剛性指針相等。例如。字符串的isEqual將比較每個字符串的內容,而不是它們都擁有的字符數組的地址。請參閱http://stackoverflow.com/questions/3741281/should-you-use-isequal-或 – CodaFi
回過頭幾章,閱讀* object *和* reference *之間的區別。 –