1. 程式人生 > >iOS -- Effective Objective-C 閱讀筆記 (8)

iOS -- Effective Objective-C 閱讀筆記 (8)

cti 結構 事件處理 決定 smu 擁有 ive 總結 dst

若想令自己縮寫的對象具有拷貝功能, 則需要實現 NSCopying 協議,

如果自定義的對象分為可變版本與不可變版本, 那麽就要同時實現 NSCopying 協議和 NSMutableCopying 協議

復制對象是需要決定采用淺拷貝還是深拷貝, 一般情況下采用淺拷貝,

如果你所寫的對象需要深拷貝, 那麽就考慮新增一個專門執行深拷貝的方法.\

// 協議與分類

OC 語言有意向特性叫做 ‘協議‘, 它與 Java 的 ‘接口‘類似, OC 不支持多重繼承,因而我們吧某個類應該實現的一系列方法定義在協議中.協議最常見的是實現委托模式, 不過也有其他用法, 理解並善用協議可令代碼邊的易於維護, 因為協議這種方式能很好的描述接口.

‘分類‘也是 OC 的一項重要語言特性, 利用分類機制,我們無需繼承子類即可直接為當前類添加方法.

// 通過委托與數據源協議進行帝鄉鍵通信.

對象之間經常需要互相通信,而通信的模式,OC 開發者廣泛使用一種名為 ‘委托模式‘的變成來實現對象間的通信,該模式的主旨是: 定義一套接口, 某個對象若想接受另一套對象的委托, 則需要遵從此接口,以便成為其‘委托對象‘,而這‘另一個對象‘則可以給其委托對象回傳一些信息, 也可以在發生事件是通知委托對象.

// 此模式可將數據與業務邏輯解耦, 比方說, 用戶界面裏有一個顯示一系列數據所用的視圖, 那麽,此試圖只應包含顯示數據所需邏輯代碼, 而不應該決定要顯示何種數據以及數據之間如何交互的問題, 視圖對象的屬性中, 可以包含負責數據與事件處理的對象, 這兩種對象分別稱為‘數據源‘ 與 ‘委托‘. // 委托協議名通常是在相關類名後面加上 Delagate 一詞,整個類名采用駝峰命名法.以便使用此代碼的人理解, // 有了這個協議之後, 類就可以用一個屬性來存放委對象. // @property (nonatomic, weak) iddelagete 一定要註意,這個屬性需要定義成 weak, 而非 strong, 因為兩者之間必須是 ‘非擁有關系‘

// 委托協議中的方法一般都是可選的, 因為 扮演 ‘受委托者‘ 角色的這個對象未必關心其中所有的方法, 為了指明可選方法,委托協議經常使用 @optional 關鍵字來標註大部分或全部的方法.

// 如果要在委托對象上調用可選方法, 那麽必須提前使用類型信息查詢方法 判斷這個委托對象能否響應相關選擇子.

// if ([_delegate respondsToSelector:@selector(action:)]) {

// [_delegate action:sender];

// }

// 這段代碼用 ‘respondsToSelector‘ 來判斷委托對象是否實現了相關方法, 如果實現了, 就調用, 如果沒有實現, 就不執行任何操作, 這樣的話, delegate 對象就可以完全按照其需要來實現委托協議的方法, 不用擔心因為哪個方法沒有實現而導致程序出問題, 即使沒有設置委托對象,程序也能正常運行. 因為給 nil 發消息將使得 if 語句的值成為 false.

// 總結:

// 委托模式為對象提供了 一套接口, 使其可由此將相關事件告知其他對象.

// 將委托對象應該支持的接口定義成協議, 在協議中把可能需要處理的時間定義成方法.

// 當某個對象需要從另外一個對象中獲取數據時,可以使用委托模式. 這種情境下, 該模式 也可以叫做 ‘數據源協議‘.

// 若有必要. 可實現含有位段的結構體, 將委托對象是否能響應相關協議方法這一信息緩存至其中;

iOS -- Effective Objective-C 閱讀筆記 (8)