iOS理解「物件等同性」這一概念

2021-07-27 14:50:42 字數 3239 閱讀 9640

前言

最近看了一道題

nsstring *s1 = @"hello world"; nsstring *s2 = @"hello world";請問 s1 == s2的返回值是yes還是no?, 相信很多童鞋的答案都是no,可能大家認為s1、s2兩個物件的位址不同,但是事實真的如此麼?

為此特意寫了乙個demo來印證下:

#import 

int main(int argc, const

char * argv)

return0;}

//logcat如下

2017-02-28

13:27:45.326 testequal[6456:440040] str1: 0x100001048

2017-02-28

13:27:46.022 testequal[6456:440040] str2: 0x63626135

2017-02-28

13:27:46.765 testequal[6456:440040] str3: 0x100001048

2017-02-28

13:27:47.284 testequal[6456:440040] str4: 0x100001048

2017-02-28

13:27:47.732 testequal[6456:440040] str5: 0x100001048

2017-02-28

13:27:48.835 testequal[6456:440040] str6: 0x100102370

2017-02-28

13:27:49.690 testequal[6456:440040] str7: 0x63626135

2017-02-28

13:28:05.204 testequal[6456:440040] str8: 0x100001048

2017-02-28

13:28:16.683 testequal[6456:440040] str9: 0x100001048

2017-02-28

13:29:17.041 testequal[6456:440040] ***************

2017-02-28

13:29:18.178 testequal[6456:440040] str1 == str2 no

2017-02-28

13:29:21.152 testequal[6456:440040] str1 equal str2 yes

2017-02-28

13:31:01.274 testequal[6456:440040] str1 == str3 yes

2017-02-28

13:31:01.274 testequal[6456:440040] str1 == str4 yes

2017-02-28

13:31:02.918 testequal[6456:440040] str3 == str4 yes

2017-02-28

13:31:02.918 testequal[6456:440040] str2 == str6 no

2017-02-28

13:31:02.918 testequal[6456:440040] str2 equal str6 yes

2017-02-28

13:31:02.918 testequal[6456:440040] str2 == str7 yes

2017-02-28

13:31:02.919 testequal[6456:440040] 1

由此可以得出結論

tips:

1. str1 是 直接使用字面量語法賦值的變數。所以,跟str8,str9是一樣的,編譯器都會執行同樣的**來生成物件。

str3和str4,則都是根據乙個已知的字串變數來生成物件。其實就是比上面tip1多了乙個步驟、所以,str3和str8,str4和str9位址是相同的

str2和str7[nsstring stringwithformat:@"%@",@"abc"]都是格式化生成,位址也是相同的

擴充套件:nsstring *str10 = [nsstring stringwithformat:@"%@",str1];同理,如果新加乙個str10,那它的位址應該跟str2,str7也是一樣的

str5[str1 copy]和str6[str1 mutablecopy]

這兩個涉及到深淺拷貝,

str5是str1的淺拷貝,指標都指向相同的位址

str6是str1的深拷貝,等於重新建立了乙個新的物件所以位址是不同的

因此如果上面的問題換種問法,比如:

nsstring *s1 = @"hello";

nsstring *s2 = [[nsstring alloc] initwithstring:s1];

請問s1==s2的返回值?

或者nsstring *s1 = [nsstring stringwithformat:@"hello"];

nsstring *s2 = [nsstring stringwithformat:@"hello"];

請問s1==s2的返回值?

答案也都是yes!

ps:單說nsstring,系統為我們提供了乙個isequaltostring:方法,所以一般情況下來說,我們是不會使用==來判斷兩個nsstring物件是否相等的。

==isequaltostring:有什麼區別呢?

由上面的例子也可以看到,

str1 == str2 no

str1 equal str2 yes

isequaltostring:應該是只比較了兩個物件的值,不比較位址

==則會比較兩個物件的位址和值是否都相等

畢竟判斷兩個物件是否相等的條件是:

當且僅當其「指標值(pointer value)」完全相等時,這兩個物件才相等.

08 理解「物件等同性」這一概念

nsstring foo badger 123 nsstring bar nsstringstringwithformat badger i 123 bool eauala foo bar no bool equalb foo isequal bar yes bool equalc foo iseq...

第八條 理解「物件等同性」這一概念

isequaltostring 比isequal 快,因為後者還要之行額外的步驟,因為它不知道受檢測的物件型別。nsobject協議中有連個用於判斷等同性的關鍵方法 bool isequal id object nsuinterger hash 要點 若想檢測物件的等同性,請提供 isequal 於...

iOS判斷物件等同性

物件等同性 無論我們使用什麼語言,總是會出現需要判斷兩個物件是否相等的情況,oc當然也不例外。首先看一段 nsstring str1 nsstring alloc initwithcstring equal encoding nsutf8stringencoding nsstring str2 eq...