第23條:通過委托與數據源協(xié)議進行對象間通信懒叛。
Objective-C廣泛使用委托模式(Delegate patttern)來實現對象間的通信,其主旨是:為對象A定義一套接口骤铃,對象B接受對象A的委托绩蜻,需要遵從這套接口礁苗。通過接口,對象A在發(fā)生事件時可以通知對象B级解,也可以向對象B傳遞信息冒黑。接口通常以協(xié)議(protocol)方式呈現。
委托模式可將數據與業(yè)務邏輯解耦勤哗。比如抡爹,UI視圖只應包含顯示數據邏輯,其數據交互處理可交由委托對象處理芒划。視圖一般包含負責數據的數據源(data source)對象和負責事件的委托(delegate)對象冬竟。為避免循環(huán)引用,視圖對委托屬性必須是非擁有關系民逼,需要使用weak關鍵字诱咏。
協(xié)議中使用@optional關鍵字表示委托對象可選擇是否實現方法,調用該方法前需要先用respondsToSelector:來檢測方法是否已實現缴挖,判斷結果特定場景下可緩存起來袋狞,減少檢測次數。
協(xié)議中必須實現的方法通常用于強制實現的接口規(guī)范映屋,可直接調用苟鸯。
第24條:將類的代碼分散到便于管理的多個分類中。
Objective-C分類機制棚点,可以把類代碼按邏輯劃入幾個分區(qū)中早处,利于開發(fā)和調試。類的基本要素瘫析,如屬性砌梆、初始化方法等都在主實現(main implement)聲明,不同類型的操作方法則歸入各個分類中贬循。
編寫程序庫時咸包,可以考慮創(chuàng)建private分類,實現私有方法杖虾,隱藏實現細節(jié)烂瘫。
第25條:為第三方類的分類及其方法名加上前綴。
因為Objective-C分類可以多個并存奇适,為第三方類添加分類坟比,使用簡單名稱芦鳍,可能會存在同名分類和相同方法,導致其中一個分類方法被覆蓋葛账,有可能產生非預期結果柠衅。解決問題的建議是為分類及其方法名加上專用前綴,降低沖突幾率籍琳。
第26條:分類中盡量不要聲明屬性菲宴。
分類無法合成與屬性相關的實例變量,如果在分類聲明屬性巩割,需要為該屬性實現存取方法裙顽,可聲明為@dynamic,到運行期才能提供宣谈,編譯期不可見愈犹。
關聯(lián)對象能夠解決分類中不能合成實例變量的問題,需要遵從內存慣例語義闻丑。一般情況下并不推薦使用關聯(lián)對象漩怎,因此,應盡量在主實現聲明屬性嗦嗡。
第27條:使用class-continuation分類隱藏實現細節(jié)勋锤。
class-continuation分類定義在類的實現文件中,用于隱藏實現細節(jié)侥祭,格式如下
@interface className () {
//?實例變量
}
// proterty
// method
@end
Objective-C可能包含C++代碼叁执,如果在頭文件引入C++頭文件,那么實現文件不能使使用.m擴展名矮冬,而要使用.mm擴展名谈宛。如果使用C++編寫的第三庫采用這種方式,則必須要求使用者的實現文件使用.mm擴展名胎署,這樣做不太合適吆录。使用class-continuation分類添加C++的實例變量可以解決這個問題,只需要在實現文件引入C++頭文件琼牧,對外提供的純Objective-C接口恢筝,對于使用者來說比較友好。
class-continuation分類還有一種用法巨坊,是把在public接口聲明為只讀的屬性撬槽,擴展為可讀寫。這樣外部無法修改屬性抱究,內部比較容易管理數據恢氯。例如
頭文件聲明類
@interface EOCPerson : NSObject
@property (nonatomic, copy, readonly) NSString * firstName;
@end
實現文件可使用class-continuation分類進行擴展
@interface EOCPerson ()
@property (nonatomic, copy, readwrite) NSString * firstName;
@end
如果需要隱藏協(xié)議細節(jié),也可以使用class-continuation分類鼓寺,例如
@interface EOCPerson () <EOCSecretDelegate>
@end
第28條:通過協(xié)議提供匿名對象勋拟。
Objective-C可以用協(xié)議把API實現細節(jié)隱藏起來,對外僅提供遵從協(xié)議對id類型(匿名對象妈候,anonymous object)敢靡。使用者不知道API的名稱和細節(jié),也不關心苦银。匿名對象表明具體類型并不重要啸胧,僅需要能響應協(xié)議方法。在程序設計中幔虏,同一套協(xié)議接口纺念,可能會由不同的對象來實現。數據持久化常使用匿名對象想括,如數據庫陷谱、文件處理、緩存等等瑟蜈。