[16]Effective Objective-C 2.0【8-9】

第八條:理解“對象等同性”這一概念

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>

最后編輯于
?著作權(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)容