第八條:理解“對象等同性”這一概念
isEqualToString 比isEqual 快,因為后者還要之行額外的步驟,因為它不知道受檢測的對象類型。
NSOBject協(xié)議中有連個用于判斷等同性的關(guān)鍵方法:
- (BOOL)isEqual:(id)object;
- (NSUInterger)hash;
要點:
若想檢測對象的等同性,請?zhí)峁癷sEqual:” 于hash方法。
相同的對象必須具有相同的哈希碼,但是兩個相同的哈希碼的對象卻未必相同。
不要盲目的逐個檢測每條屬性,而是應(yīng)該依照具體的需求來制定檢測方案。
編寫hash方法是,應(yīng)該使用計算速度快而且哈希碼碰撞幾率低的算法。
- (NSUInteger)hash返回一個整數(shù),這個數(shù)代表的就是當(dāng)前對象的哈希值
有一個很重要的規(guī)范 : 如果兩個對象相等,他們的hash值必須相等, 如果某個類自定義了isEqual方法,并且這個類的實例有可能會被加入到集合中,一定要確保hash方法被重新定義
一個對象什么時候執(zhí)行hash方法:
一個對象在用作key值時,其 hash 方法會被調(diào)用,用以生成一個唯一標識符,NSDictionary 需要根據(jù)唯一 key 值(根據(jù) hash 算法生成的值)查找對象, NSSet 需要根據(jù) hash 值來確保過濾掉重復(fù)的對象。
第九條:以“類族模式”隱藏實現(xiàn)細節(jié)
“類族”是一種很有用的模式,可以隱藏“抽象基類”背后的實現(xiàn)細節(jié),OC系統(tǒng)框架中普遍使用此模式。比如UIKit中就有一個名為UIButton的類,創(chuàng)建按鈕,則可以調(diào)用下面這個類方法:
+ (UIButton *)buttonWithType:(UIButtonType)type;
該方法所返回的對象,其類型取決于傳入的按鈕類型,然而不管返回什么類型的對象,他們都繼承同一個基類:UIButton,這么做的意義在于:UIButton類的使用者無需關(guān)心創(chuàng)建出來的按鈕具體屬于哪個子類,也不用考慮按鈕的繪制方式等實現(xiàn)細節(jié)。
“類族模式”可以靈活應(yīng)對多個類,將他們的實現(xiàn)細節(jié)隱藏在抽象基類后面,以保持接口簡潔,用戶無需自己創(chuàng)建子類實例,只需調(diào)用基類方法來創(chuàng)建即可。
每個“實體子類”都繼承基類,
- 使用類族的好處:可以把實現(xiàn)細節(jié)隱藏再一套簡單的公共接口后面
- 系統(tǒng)框架中經(jīng)常使用類族。
- 從類族的公共抽象 基類中基礎(chǔ)子類 是要當(dāng)心,若是有開發(fā)文檔,則應(yīng)該首先閱讀。
covariant && contravariant
__covariant : 子類型可以強轉(zhuǎn)到父類型(里氏替換原則)
// NSArray
@interface NSArray<__covariant ObjectType> : NSObject
< NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration>