第8條:對象等同性概念。
NSObject協(xié)議中聲明的isEqual九串,用于判斷兩個對象的等同性残吩。某些特定類?特殊的方法判斷對象等同性,如NSString的isEqualToString哺眯。==表示指針指向同一對象,isEqual一般表示指針值相等扒俯,復(fù)雜的類若有需要可覆寫該方法奶卓。
若兩個對象等同,其哈希碼hash也相等撼玄,但hash相等兩個對象未必等同夺姑。hash在集合中,檢索哈希表(hash table)時掌猛,會用對象的哈希碼做索引盏浙,比如set,可能會根據(jù)hash把對象分配到不同的數(shù)組荔茬,添加新對象時废膘,回根據(jù)hash找到對應(yīng)數(shù)組,依次檢測數(shù)組中是否有相同的對象兔院。因此若要重寫hash殖卑,既要減少碰撞(collision),保持效率坊萝,也要控制hash在一定范圍內(nèi),降低復(fù)雜度许起。
NSArray用isEqualToArray來判斷對象等同性十偶,而NSDictionary則使用isEqualToDictionary。由于Objective-C在編譯期不做強制類型檢查(strong type check)园细,開發(fā)者應(yīng)保證對象類型正確惦积。
對象等同性執(zhí)行深度取決于受測對象的實際情況。
把可變?nèi)萜鞣湃爰闲枰⒁庀叵嗟鹊碾[患猛频,一般不建議這么做狮崩。如一個集合添加了兩個不同的可變數(shù)組,集合此時有兩個不同的元素鹿寻,而當(dāng)一個可變數(shù)組改成與另外一個相等時睦柴,則會造成集合中有兩個等同的數(shù)組,有可能不符合需要毡熏。
第9條:以類族模式隱藏實現(xiàn)細節(jié)坦敌。
類族(class cluster)模式(pattern),可以隱藏抽象基類(abstract base class)的實現(xiàn)細節(jié),Objective-C系統(tǒng)框架普遍使用此模式狱窘。如UIKit(user interface framework)中UIButton創(chuàng)建按鈕可用類方法buttonWithType杜顺,返回的對象取決于傳人的類型,UIButton據(jù)此創(chuàng)建不同的對象蘸炸。優(yōu)秀的程序員會重構(gòu)不同的子類躬络,將它們的實現(xiàn)細節(jié)隱藏在抽象基類后面,使用者一般不需要知道子類細節(jié)搭儒。
大部分容器是類族穷当,如NSArray和NSMutableArray。實例方法isKindOfClass可檢測是否位于類族中仗嗦。
第10條:在既有類中使用關(guān)聯(lián)對象存放自定義數(shù)據(jù)膘滨。
一般在一個類中存放自定義數(shù)據(jù)的做法是繼承這個類。而一些特殊的機制下可能難以這么做稀拐,例如引入第三方庫創(chuàng)建的對象可能是固定的類型火邓,難以替換成子類。Objective-C的關(guān)聯(lián)對象(Associated Object)可解決此問題德撬。一個類對象可通過鍵關(guān)聯(lián)其他對象铲咨,并指明存儲策略(storage policy),維護內(nèi)存管理語義蜓洪。
關(guān)聯(lián)類型與屬性對應(yīng)關(guān)系如下:
OBJC_ASSOCIATION_ASSIGN assign
OBJC_ASSOCIATION_RETAIN_NONATOMIC nonatomic纤勒,retain
OBJC_ASSOCIATION_COPY_NONATOMIC nonatomic,copy
OBJC_ASSOCIATION_RETAIN retain
OBJC_ASSOCIATION_COPY copy
objc_setAssociatedObject是關(guān)聯(lián)方法隆檀。
objc_getAssociatedObject是獲取方法摇天。
objc_removeAssociatedObjects是移除方法。
關(guān)聯(lián)方法很有用恐仑,但不能濫用泉坐,應(yīng)優(yōu)先選擇其他方法,如繼承裳仆。