第8條:理解“物件等同性”這一概念

weixin_34208283發表於2018-08-09

根據“等同性”來對比物件我們經常用到。
==操作符比較的是兩個指標本身,而不是其所指的物件。應該使用NSObect協議中宣告的“isEquel:”方法來判斷兩個物件的等同性。

NSString類實現了自己獨有的等同性判斷方法,“isEqualToString:”。比對NSString物件,呼叫該方法比呼叫“isEquel:”快,後者還要執行額外的步驟,因為不知道受測物件的型別。

NSObect協議中有兩個判斷等同性的關鍵方法:

- (BOOL)isEqual:(id)object;
+ (NSUInteger)hash;

當且僅當其“指標值”(可以理解為記憶體地址)完全相等時,這兩個物件才相等。若自定義物件覆寫這些方法,必須先理解其約定:如果“isEquel:”方法判定兩個物件相等,那麼其hash方法也必須返回同一個值。但是,如果兩個物件的hash方法返回同一個值,那麼“isEquel:”方法未必會認為兩者相等。

覆寫“isEquel:”方法步驟:
1、判斷兩個指標是否相等,相等則是同一物件。
2、判斷所屬的類
3、檢測每個屬性是否相等。

覆寫hash方法,應該使用計算速度快而且雜湊碼碰撞機率低的演算法。

特定類所具有的等同性判定方法

NSArray類有"isEqualToArray:"方法。
NSDictionary類有"isEqualToDictionary:"方法。

相關文章