前言
最近看了一道題
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...