判斷對(duì)象是否相等的方法,==與 isEqual


  • == 比較兩個(gè)對(duì)象的內(nèi)存地址

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

  • isEqual: 默認(rèn)情況下是比較兩個(gè)對(duì)象的內(nèi)存地址咕宿,但是有一些系統(tǒng)自帶的類(比如Foundation中的NSString,NSArray等)重寫了這個(gè)方法圆存,改變了這個(gè)方法的判斷規(guī)則(一般改為比較兩個(gè)對(duì)象的內(nèi)容,不是內(nèi)存地址)

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

- (void)test1
{
   NSString *string1 = @"jack";
   NSString *string2 = [NSString stringWithFormat:@"jack"];

//理論上存儲(chǔ)在內(nèi)存不同區(qū)域,為不同對(duì)象,但系統(tǒng)重寫后改成了比較內(nèi)容
   NSLog(@"%p %p", string1, string2);

   NSLog(@"string1 == string2 -> %zd", string1 == string2); // 結(jié)果為0

   NSLog(@"[string1 isEqualToString:string2] -> %zd", [string1 isEqualToString:string2]); // 結(jié)果為1

   NSLog(@"[string1 isEqual:string2] -> %zd", [string1 isEqual:string2]); // 結(jié)果為1

}

同理下面的兩個(gè)數(shù)組并不是同一個(gè),但是內(nèi)容相同,因此會(huì)被判定為相同

- (void)test2
{
    NSString *string1 = [NSString stringWithFormat:@"111"];
    NSString *string2 = [NSString stringWithFormat:@"222"];
    //兩個(gè)存儲(chǔ)不同對(duì)象的數(shù)組,但內(nèi)容是相同的
    NSArray *array1 = @[string1, @"222", @"333"];
    NSArray *array2 = @[@"111", string2, @"333"];
    
    NSArray *array = @[array1, array2];
    
    NSLog(@"%zd", [array indexOfObject:array2]);//結(jié)果為0
}

如果有兩個(gè)內(nèi)容相同的MYPerson對(duì)象,則會(huì)被認(rèn)為是不同的,因?yàn)榇藭r(shí)是對(duì)內(nèi)存地址進(jìn)行比較,看是不是同一個(gè)對(duì)象

//沒(méi)有重寫isEqual
- (void)test3
{
    MYPerson *p1 = [[MYPerson alloc] init];
    p1.age = 20;
    p1.no = 30;
    
    MYPerson *p2 = [[MYPerson alloc] init];
    p2.age = 20;
    p2.no = 30;
    
    NSLog(@"%p %p", p1, p2);
    NSLog(@"p1 == p2 -> %zd", p1 == p2); // 0
    NSLog(@"[p1 isEqual:p2] -> %zd", [p1 isEqual:p2]); // 0
}

如果希望MYPerson也能像系統(tǒng)的類NSString一樣,能夠?qū)?nèi)容相同的兩個(gè)不同對(duì)象也認(rèn)定為相同,需要重寫isEqual方法

//重寫后
- (void)test3
{
    MYPerson *p1 = [[MYPerson alloc] init];
    p1.age = 20;
    p1.no = 30;
    
    MYPerson *p2 = [[MYPerson alloc] init];
    p2.age = 20;
    p2.no = 30;

    NSArray *array = @[@"2", @"6", p1, @"111"];
    
    NSLog(@"%zd", [array indexOfObject:p2]);//結(jié)果為2
}

MYPerson中重寫代碼如下:


#import <Foundation/Foundation.h>

@class MYCar;

@interface MYPerson : NSObject
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, assign) NSInteger no;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) MYCar *car;

- (BOOL)isEqualToPerson:(MYPerson *)person;
@end

#import "MYPerson.h"
#import "MYCar.h"

/*
 一旦重寫了isEqual:方法恩掷,最好重寫hash方法,而且要遵守以下原則:
 1.isEqual:返回YES的2個(gè)對(duì)象糟秘,hash值一定要一樣
 2.hash值一樣的2個(gè)對(duì)象黔攒,isEqual:返回不一定是YES
 */

@implementation MYPerson

- (NSUInteger)hash
{
    return self.age + self.no + self.name.hash + self.car.hash;
}

- (BOOL)isEqual:(MYPerson *)object
{
    return [self isEqualToPerson:object];
}

- (BOOL)isEqualToPerson:(MYPerson *)person
{
    // 如果是完全相同的對(duì)象,就省去后面的判斷
    if (self == person) return YES;
    
    // 如果object的類型不對(duì)舶斧,就不需要比較
    if (![person isKindOfClass:self.class]) return NO;
    
    // 基本數(shù)據(jù)類型
    BOOL result = (self.age == person.age && self.no == person.no);
    if (result == NO) return result;
    
    // 對(duì)象類型,兩個(gè)對(duì)象為nil時(shí)isEqual:的結(jié)果為0(NO),所以需要專門處理
    if (self.name || person.name) {
        if (![self.name isEqual:person.name]) return NO;
    }
    
    if (self.car || person.car) {
        if (![self.car isEqual:person.car]) return NO;
    }
    
    return YES;
}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欣鳖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子茴厉,更是在濱河造成了極大的恐慌泽台,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矾缓,死亡現(xiàn)場(chǎng)離奇詭異怀酷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嗜闻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門蜕依,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人琉雳,你說(shuō)我怎么就攤上這事样眠。” “怎么了翠肘?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵檐束,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我束倍,道長(zhǎng)被丧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任绪妹,我火速辦了婚禮甥桂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邮旷。我一直安慰自己格嘁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布廊移。 她就那樣靜靜地躺著糕簿,像睡著了一般探入。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懂诗,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天蜂嗽,我揣著相機(jī)與錄音,去河邊找鬼殃恒。 笑死植旧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的离唐。 我是一名探鬼主播病附,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼亥鬓!你這毒婦竟也來(lái)了完沪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嵌戈,失蹤者是張志新(化名)和其女友劉穎覆积,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熟呛,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宽档,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庵朝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吗冤。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖九府,靈堂內(nèi)的尸體忽然破棺而出椎瘟,到底是詐尸還是另有隱情,我是刑警寧澤昔逗,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布降传,位于F島的核電站篷朵,受9級(jí)特大地震影響勾怒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜声旺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一笔链、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腮猖,春花似錦鉴扫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)炕婶。三九已至,卻和暖如春莱预,著一層夾襖步出監(jiān)牢的瞬間柠掂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工依沮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涯贞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓危喉,卻偏偏與公主長(zhǎng)得像宋渔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辜限,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 前言 對(duì)數(shù)據(jù)的等同性判斷包括對(duì)基本數(shù)據(jù)類型等同性的判斷和對(duì)象等同性的判斷皇拣。對(duì)基本數(shù)據(jù)類型等同性的判斷是非常簡(jiǎn)單的,...
    VV木公子閱讀 1,463評(píng)論 0 8
  • 1态蒂、從理論上講,根本沒(méi)有“當(dāng)下”這樣一個(gè)概念费什,因?yàn)槟恪艾F(xiàn)在”經(jīng)歷的每一瞬間钾恢,都馬上會(huì)變成“過(guò)去”的那一瞬間。 2鸳址、...
    楠神鍋鍋閱讀 785評(píng)論 0 1
  • 心中有集體稿黍,腦中有理智疹瘦,看到即去行動(dòng)。女人或男人巡球,心胸狹窄又自私是可卑的(卑鄙無(wú)恥)言沐!
    霧蓮閱讀 114評(píng)論 1 0
  • 無(wú)需諱言矿筝,不少公司采用的是“機(jī)會(huì)主義戰(zhàn)略”起便,通過(guò)撲捉市場(chǎng)機(jī)會(huì),獲得了階段性的增長(zhǎng)。不愿化大力氣培育核心競(jìng)爭(zhēng)力榆综,也不...
    南山行者369閱讀 505評(píng)論 0 1
  • 為你說(shuō) 你是我心中一個(gè)白發(fā)蒼蒼的夢(mèng)想 你是我陸里海里漂洋的港 你是細(xì)語(yǔ)萬(wàn)千 你是驕陽(yáng)艷艷 你是我人山人海中的一睜眼...
    夏三三閱讀 217評(píng)論 0 2