2012-10-03 40 views
0

我正在檢查從NSURLConnectionDataDelegate回來的對象是否與我最初創建的對象相同。我一直在做的是:測試對象相等,即相同的物理地址?

// TESTING TO SEE IF THE RETURNED OBJECT IS THE SAME ONE I CREATED 
if(connection == [self connectionPartial]) { 

但只是好奇是,這是一樣的做:

if([connection isEqual:[self connectionPartial]]) { 

回答

1

相同。

if(connection == [self connectionPartial]) { 

此比較地址對象的,例如。如果指針指向同一個實例。

if([connection isEqual:[self connectionPartial]]) { 

此比較內容中的對象的。例如,對於兩個獨立的NSString情況下,這將作爲長期回報YES作爲字符串的內容是一樣的:

NSString *s1 = @"Something"; 
NSString *s2 = @"Something"; 
BOOL sameInstances = (s1 == s2); // will be false, since they are separate objects. 
BOOL sameContent = [s1 isEqual:s2]; // will be true, because they both are "Something" 
+0

非常感謝,正如我所說的,我已經完成了==(並在調試器中檢查了地址匹配),但我注意到isEqual:即使在查看文檔後也不完全確定它做了什麼。 – fuzzygoat

1

的第一個片段指針的值本身進行比較,就好像它們是任何原始類型像int。如果地址相同,則表達式將評估爲真。

第二個將消息isEqual:發送到其中一個連接實例。任何類都可以覆蓋isEqual:以與另一個實例定義「相等」。這是完全有可能爲一類的實現的isEqual:是:

- (BOOL)isEqual: (id)obj 
{ 
    return arc4random_uniform(2) ? YES: NO; 
} 

所以,不,幾乎所有類,他們是不等價的。 (NSObject,其中有「默認」的實施isEqual:,使用對象的hash ES,這又在默認情況下,是他們的地址。)

這聽起來像使用等於運算符,==,你的情況正確。

+0

請注意,如果您重寫'isEqual:',您應該重寫'hash'併爲相等的對象返回相同的值。 – DrummerB