《Effective Objective-C 2.0》讀書筆記(一)

《Effective Ovjective-C 2.0》真心是一本可以幫助我更好理解OC語言的一本書,現(xiàn)在正在閱讀中,作者在書中所提到的很多語法技巧和建議對我都很有幫助。遂在此將讀書時的筆記和自己的理解整理與此。

xiu!

對象等同性

“==”與“isEqual:”:
  • ==操作比較的是兩個指針本身,而不是所指的對象。NSObject協(xié)議中聲明的isEqual:方法可以用來判斷兩個對象的等同性。
  • NSString類實現(xiàn)了一個自己獨(dú)有的的等同性判斷方法isEqualToString:。傳遞給該方法的對象必須是NSString類型的,調(diào)用該方法比isEqual:快,后者還要先判斷對象的類型。

如果是自己定義的類:

Person *person1 = [[Person alloc] init];
Person *person2 = [[Person alloc] init];

使用isEqual:方法判斷:

NSLog(@"\nisEqual == %d", [person1 isEqual:person2]);

得到結(jié)果:

2016-03-24 15:44:39.189 Property_Demo[56504:3135972]
isEqual == 0

如果是系統(tǒng)框架提供的類:

NSArray *arr1 = [NSArray arrayWithObjects:person1, nil];
NSArray *arr2 = [NSArray arrayWithObjects:person1, nil];
NSLog(@"\nisEqual == %d", [arr1 isEqual:arr2]);

得到結(jié)果:

2016-03-24 15:50:16.027 Property_Demo[56691:3146107]**
isEqual == 1**

自己定義的類可以重寫isEqual:方法,通常,如果兩個對象的所有屬性都相等,那么就可以認(rèn)為兩個對象就想等,判斷思路可以為:

  1. 是否相同指針(object1 == object2)
  2. 是否同一類型([object1 class] == [object2 class])
  3. 每個屬性是否相同

也可以為自己的類編寫自己的等同性判定方法,同時,也應(yīng)一并覆寫isEqual:方法:

- (BOOL)isEqualToPerson:(Person *)anotherPreson {
    if (self == anotherPreson) {
        return YES;
    }
    if (![_firstName isEqualToString:anotherPreson.firstName]) {
        return NO;
    }
    if (![_lastName isEqualToString:anotherPreson.lastName]) {
        return NO;
    }
    if (_age != anotherPreson.age) {
        return NO;
    }
        return YES;
}

- (BOOL)isEqual:(id)object {
    if ([self class] == [object class]) {
        return [self isEqualToPerson:(Person *)object];
    } else {
        return [super isEqual:object];
    }
}
isEqual和hash:
  • isEqual:為真,則必須具有相同的哈希碼;
  • hash相同,則未必isEqual:為真;

在NSSet中,根據(jù)對象的hash碼為對象分組(相同的hash碼作為一個數(shù)組),在向set添加對象時,若在set中無該hash碼所對應(yīng)的數(shù)組,則該set中一定沒有這個對象。若set中有該hash碼所對應(yīng)的數(shù)組,那么遍歷這個數(shù)組中的對象,看該數(shù)組中是否有和將要添加的對象相同的對象。因此:

  • 如果hash碼不同,isEqual:強(qiáng)制放回YES,則可以被添加到set中;
  • 如果將某一類的對象返回相同的hash碼,則在向set添加對象時會降低效率。
判斷等同性的執(zhí)行深度(deep equality)

NSArray與NSDictionary也有對應(yīng)的等同性判定方法,前者為isEqualToArray:,后者為isEqualToDictionary:,如果傳入對象不是數(shù)組或字典,那么這兩個方法會拋出異常。
NSArray的檢測方式:先檢查所對比數(shù)組個數(shù),若相等,則使用isEqual對比兩個數(shù)組中相對應(yīng)位置的對象,如果均相等,則判定兩個數(shù)組是相等的。
然而是否要在等同性判定方法中逐條檢測全部字段或全部對象,要是具體情況而定。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容