對(duì)象等同性是比對(duì)兩個(gè)對(duì)象非常有用的功能卵凑。但一般情況 == 操作符比對(duì)出來(lái)的結(jié)果可能并不準(zhǔn)確或并不是我們想要的旁趟,因?yàn)?== 比對(duì)的是兩個(gè)指針本身贾节,并不是指針?biāo)傅膶?duì)象袖肥。
不如NSString類(lèi)就有一個(gè)自己的對(duì)象等同性判斷方法 isEqualToString:火欧。這個(gè)方法比isEqual:執(zhí)行速度更快棋电,因?yàn)楹笳哌€需要判斷對(duì)象類(lèi)型,而isEqualToString:只能傳入NSString類(lèi)型苇侵。
NSObject協(xié)議中有兩個(gè)用于判斷對(duì)象等同性的方法
- (BOOL)isEqual:(id)object;
- (NSUInteger)hash;
這兩個(gè)方法的實(shí)現(xiàn)機(jī)制是离陶,當(dāng)且僅當(dāng)指針完全相等時(shí)兩個(gè)對(duì)象才相等。所以如果想重寫(xiě)這兩個(gè)方法衅檀,如果isEqual:方法判斷兩個(gè)對(duì)象相等招刨,那么hash方法也必須返回同一個(gè)值。
比如以下這個(gè)例子:
有Person這個(gè)類(lèi)
我們?nèi)绻J(rèn)為Person的firstName哀军,lastName沉眶,age都相等,那么兩個(gè)Person的對(duì)象就相等杉适,那么isEqual:方法就可以寫(xiě)成:
接下來(lái)實(shí)現(xiàn)hash方法谎倔。因?yàn)閮蓚€(gè)對(duì)象的hash算法以屬性值的唯一性來(lái)確保對(duì)象的差異性,也就是說(shuō)猿推,只要兩個(gè)對(duì)象屬性值一致片习,那這兩個(gè)對(duì)象的就是相等的。NSObject自帶的hash方法相當(dāng)于hash表中的f(key)函數(shù)中的key蹬叭,這“唯一”的key需要用戶自己產(chǎn)生藕咏,至于用什么算法由用戶自己決定,所以秽五,只要我們規(guī)定一種不會(huì)產(chǎn)生重復(fù)hash碼的方法即可孽查。
比如
使用hash方法,所以我們的isEqual:方法就可以寫(xiě)成
大功告成坦喘。