iOS- == isEqual 和 isEqualToString

OC中的對象都是用指針表示绘盟,方法的調(diào)用是基于消息機制實現(xiàn)刨沦,

==

== 比較的自然是指針指向的地址
對于基本類型, ==運算符比較的是值; 對于對象類型, ==運算符比較的是對象指向的地址 (即是否為同一對象)

isEqual 和 isEqualToString 的區(qū)別:
IsEqual 是 NSObject 的方法 诗宣,而 isEqualToString 是 NSString 的方法
因此從繼承關系角度來說isEqualToString 是 isEqual 的衍生方法

isEqualToString: 比較兩個字符串的內(nèi)容

isEqual: 默認情況下是比較兩個對象的內(nèi)存地址,但是有一些系統(tǒng)自帶的類(比如Foundation中的NSString,NSArray等)重寫了這個方法想诅,改變了這個方法的判斷規(guī)則(一般改為比較兩個對象的內(nèi)容召庞,不是內(nèi)存地址)
isEqual ,判斷是一個類方法来破,判斷兩個對象在類型和值上是否一樣篮灼。

數(shù)組NSArray中的containsObject:,indexOfObject:方法就是利用isEqual來比較的,所以數(shù)組中的字符串內(nèi)容一樣,也會被認為是一樣的

//str1和str2存放在常量區(qū)中,指向的是同一個地址
//str2指向常量區(qū)徘禁,str3指向的是變量字符串區(qū)域诅诱,指向的是不同地址
NSString *str1 = @"123";
NSString *str2 = @"123";
NSString *str3 = [NSString stringWithFormat:@"123"];
NSString *str4 = [NSString stringWithFormat:@"123"];
NSString *str5 = [[NSString alloc]initWithFormat:@"123"];
NSString *str6 = [[NSString alloc]initWithFormat:@"123"];
/*str3 str4 str5 str6 
字符串的內(nèi)存空間分配與其他Object對象的分配方式有所不同,
相同內(nèi)容的字符串的哈希值相同送朱,所以即使用了alloc來開辟內(nèi)存娘荡,
結(jié)果指向的內(nèi)存還是同一塊內(nèi)存,并且都存放在變量區(qū)驶沼,
兩個對象的isEqual結(jié)果是true炮沐。
*/
NSString *str7 = [[NSString alloc] initWithFormat:@"123456781234567812345678"];
NSString *str8 = [[NSString alloc] initWithFormat:@"123456781234567812345678"];
/* 值相同時:stringWithFormat  initWithFormat 會根據(jù)拼接字符串的長度來決定是否進行優(yōu)化:
是指向同一地址,還是不同地址:字符串短回怜,就指向同一地址大年;字符串很長,就指向不用地址

*/

NSLog(@"str1地址:%p",str1); //str1地址:0x10cf67068
NSLog(@"str2地址:%p",str2); //str2地址:0x10cf67068
NSLog(@"str3地址:%p",str3); //str3地址:0xa000000003332313
NSLog(@"str4地址:%p",str4); //str4地址:0xa000000003332313
NSLog(@"str5地址:%p",str5); //str5地址:0xa000000003332313
NSLog(@"str6地址:%p",str6); //str6地址:0xa000000003332313
NSLog(@"str7地址:%p",str7);//str7地址:0x604000447c20
NSLog(@"str8地址:%p",str8);//str8地址:0x604000447b00

NSLog(@"%d %d %d",str1 == str2,[str1 isEqual: str2],[str1 isEqualToString:str2]); //1 1 1
NSLog(@"%d %d %d",str2 == str3,[str2 isEqual:str3],[str2 isEqualToString:str3]); //0 1 1
NSLog(@"%d %d %d",str3 == str4,[str3 isEqual:str4],[str3 isEqualToString:str4]); //1 1 1
NSLog(@"%d %d %d",str4 == str5,[str4 isEqual:str5],[str4 isEqualToString:str5]); //1 1 1
NSLog(@"%d %d %d",str5 == str6,[str5 isEqual:str6],[str5 isEqualToString:str6]); //1 1 1
NSLog(@"%d %d %d",str7 == str8,[str7 isEqual:str8],[str7 isEqualToString:str8]);//0 1 1



//    對于一般的Object對象來說玉雾,alloc開辟出來的空間是不同的翔试,在沒有復寫isEqual方法的前提下,兩個對象的hash值和內(nèi)存地址都是不同的复旬,所以isEqual會返回false垦缅。(注意,復寫了isEqual方法的話另說赢底!)
    CJHObject * obj1 = [[CJHObject alloc]init];
    CJHObject * obj2 = [[CJHObject alloc]init];
    NSLog(@"%p,%p,equal:%d,==:%d",obj1,obj2,[obj1 isEqual:obj2],obj1 == obj2);
//    0x7fae03f25d90,0x7fae03f0a1a0,equal:0,==:0

UIColor *color1 = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
UIColor *color2 = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
UIColor *color3 = [UIColor redColor];
UIColor *color4 = [UIColor redColor];
NSLog(@"color1地址:%p",color1); //color1地址:0x600000265bc0
NSLog(@"color2地址:%p",color2); //color2地址:0x600000265900
NSLog(@"color3地址:%p",color3); //color3地址:0x600000265b00
NSLog(@"color4地址:%p",color4); //color4地址:0x600000265b00

NSLog(@"color1 == color2 = %@", color1 == color2 ? @"YES" : @"NO"); //color1 == color2 = NO
NSLog(@"color3 == color4 = %@", color3 == color4 ? @"YES" : @"NO"); //color3 == color4 = YES

NSLog(@"[color1 isEqual:color2] = %@", [color1 isEqual:color2] ? @"YES" : @"NO"); //[color1 isEqual:color2] = YES
NSLog(@"[color3 isEqual:color4] = %@", [color3 isEqual:color4] ? @"YES" : @"NO"); //[color3 isEqual:color4] = YES

幾種常見的isEqual方法:

NSString isEqualToString
NSDate isEqualToDate
NSArray isEqualToArray
NSDictionary isEqualToDictionary
NSSet isEqualToSet
NSAttributedString -isEqualToAttributedString:
NSData -isEqualToData:
NSHashTable -isEqualToHashTable:
NSIndexSet -isEqualToIndexSet:
NSNumber -isEqualToNumber:
NSOrderedSet -isEqualToOrderedSet:
NSTimeZone -isEqualToTimeZone:
NSValue -isEqualToValue:
更多參考Equality

參考:
http://www.reibang.com/p/bdd80cca4248
http://www.reibang.com/p/915356e280fc
https://blog.csdn.net/cjh965063777/article/details/50825917
http://www.reibang.com/p/ba07b644cfba
http://www.reibang.com/p/169fbe94d18b

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末失都,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子幸冻,更是在濱河造成了極大的恐慌,老刑警劉巖咳焚,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洽损,死亡現(xiàn)場離奇詭異,居然都是意外死亡革半,警方通過查閱死者的電腦和手機碑定,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門流码,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人延刘,你說我怎么就攤上這事漫试。” “怎么了碘赖?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵驾荣,是天一觀的道長。 經(jīng)常有香客問我普泡,道長播掷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任撼班,我火速辦了婚禮歧匈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘砰嘁。我一直安慰自己件炉,他們只是感情好,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布矮湘。 她就那樣靜靜地躺著斟冕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪板祝。 梳的紋絲不亂的頭發(fā)上宫静,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音券时,去河邊找鬼孤里。 笑死,一個胖子當著我的面吹牛橘洞,可吹牛的內(nèi)容都是我干的捌袜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炸枣,長吁一口氣:“原來是場噩夢啊……” “哼虏等!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起适肠,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤霍衫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后侯养,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敦跌,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年逛揩,在試婚紗的時候發(fā)現(xiàn)自己被綠了柠傍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麸俘。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惧笛,靈堂內(nèi)的尸體忽然破棺而出从媚,到底是詐尸還是另有隱情,我是刑警寧澤患整,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布拜效,位于F島的核電站,受9級特大地震影響并级,放射性物質(zhì)發(fā)生泄漏拂檩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一嘲碧、第九天 我趴在偏房一處隱蔽的房頂上張望稻励。 院中可真熱鬧,春花似錦愈涩、人聲如沸望抽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽煤篙。三九已至,卻和暖如春毁腿,著一層夾襖步出監(jiān)牢的瞬間辑奈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工已烤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鸠窗,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓胯究,卻偏偏與公主長得像稍计,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子裕循,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容