ios開發之判斷物件的等同性isEqual

2021-07-11 01:31:38 字數 1011 閱讀 1079

在開發中我們經常會遇到這樣的情況:判斷兩個元素或者物件是否相等。經常用到的有「==」或者isequal或者isequaltostring等等。下邊我們就來介紹一下這幾種方法的區別。
一、 「 == 」

「==」操作符判斷的是兩個指標本身(也就是兩個物件的記憶體位址),而不是所指的物件。

nsstring *str1 = @"bound 123";  

nsstring *str2 = [nsstring stringwithformat:@"bound %@",@"123"];

nslog(@"%@,%p",str1,&(str1));

nslog(@"%@,%p",str2,&(str2));

if (str1 == str2) else

控制台輸出結果:== no

從上邊可以看出來,str1和str2列印出來的結構都是bound 123,但是if判斷輸出no,從記憶體位址看,發現兩者記憶體位址不同,由此可以看出「 == 」判斷比較的是兩個「指標」本身,而不是物件。

二、「- (bool)isequal:(id)object; 」 「+ (nsuinteger)hash;」

nsobject協議中宣告了判斷物件等同性的兩個方法,這兩個方法返回相等條件是:當且僅當「指標值」完全相等的時候,物件才相等。如果isequal判斷兩個物件相等,那麼兩個物件的hash返回值也一定相等。反之hash值相等,isequal未必認為兩者一樣。

三、「- (bool)isequaltostring:(nsstring *)astring; 」

isequaltostring宣告了判斷字串相等的方法,有時候為了簡潔可以使用二中方法來代替使用,但是個人認為對於大多數nsobject物件慎用「- (bool)isequal:(id)object; 」方法!許多情況下會由於對指標管理的疏忽引起莫名奇妙的crash,由於時間問題暫時總結到這裡,之後會對適合使用「- (bool)isequal:(id)object; 」的場合作詳細研究與整理。

iOS判斷物件等同性

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

Objective C 判斷物件等同性

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

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

前言 最近看了一道題 nsstring s1 hello world nsstring s2 hello world 請問 s1 s2的返回值是yes還是no?相信很多童鞋的答案都是no,可能大家認為s1 s2兩個物件的位址不同,但是事實真的如此麼?為此特意寫了乙個demo來印證下 import i...