2014-03-30 39 views
0

我正在閱讀Programming with Objective-C。在確定對象平等的部分,它說下面的話:目標C中兩個對象的相等性

- 當與對象處理,操作符==用於測試兩個單獨的指針是否指向相同的對象:

if (firstPerson == secondPerson) { 
    // firstPerson is the same object as secondPerson 
} 

- 如果你需要測試兩個對象是否表示相同的數據,你需要調用的isEqual一樣的方法:,可從NSObject的:

if ([firstPerson isEqual:secondPerson]) { 
    // firstPerson is identical to secondPerson 
} 

我對==isEqual與上面的解釋之間的區別感到困惑,是不是意味着firstPerson == secondPerson[firstPerson isEqual:secondPerson]的替代?

+0

不。大多數語言的isEqual契約擴展到特定對象的方面,而不是剛性指針相等。例如。字符串的isEqual將比較每個字符串的內容,而不是它們都擁有的字符數組的地址。請參閱http://stackoverflow.com/questions/3741281/should-you-use-isequal-或 – CodaFi

+0

回過頭幾章,閱讀* object *和* reference *之間的區別。 –

回答

1

==的定義是正確的,它會檢查他們正在指向實際相同的指針/內存地址(即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

希望這有助於!讓我知道你是否需要進一步澄清。

+0

最後,一個不會嘗試在常量上使用指針級別相等的答案。 – CodaFi

+0

好'=='是散列比較,對吧?更準確 –

+0

@Basheer_CAD:不需要'=='是指針比較,沒有別的。 –

2
NSString *string1 = [[NSString alloc] initWithString:@"some string"]; 
NSString *string2 = [[NSString alloc] initWithString:@"some string"]; 
NSString *string3 = string2; 

BOOL equal1 = (string1 == string2); // NO 

BOOL equal2 = [string1 isEqual:string2]; // YES 

BOOL equal3 = (string2 == string3); // YES 

BOOL equal4 = [string2 isEqualToString:string3]; // YES 
+3

'equal1'實際上是'YES' ...(編譯器非常聰明,它只創建一次字符串文字......即使你使用'stringWithString')。 –

+0

得愛字面指針。 – CodaFi

+0

是的,我忘了字面指針:)剛更新的答案。 –

0

簡單的版本是這樣的。

==告訴你指針是否是同一個對象。

isEqual:方法家族做了一些不同的事情。 它們會告訴你,指針另一端的對象是否基於某些條件(如屬性或具有相同值的ivars或所用方法中實現的任何邏輯)有效地相同。它們可能是也可能不是完全相同的對象。

相關問題