1. 程式人生 > >iOS 物件之間的通訊方式(delegate、block、NSNotification、kvc、kvo)總結

iOS 物件之間的通訊方式(delegate、block、NSNotification、kvc、kvo)總結

有五種方式:delegate(代理)、block(程式碼塊)、NSNotification(通知)、kvc(鍵-值編碼)、kvo(​鍵值觀察模式)

1. delegate:代理是一種設計模式,它是通過被代理者定義代理協議委託代理者實現協議,用於兩個物件間的通訊互動。在 IOS 中 delegate 主要用於檢視與使用物件之間的通訊互動,delegate 的效率是最高的,典型的特就是它有返回值。

用途:常用於傳\賦值(如tableView中的委託(dateSource)中常見)或者傳遞事件(例如在非同步請求中,介面事件觸發資料層改變等等)。

注意:delegate和通知有的用法相似,區別在於前者是1對1,後者是1對多。在dealloc將delegate置為nil,以及delegate設定屬性時用assign,不用retain,避免迴圈引用

2. Block是一個C級別的語法以及執行時的一個特性,和標準C中的函式(函式指標)類似,block:block 類似與函式,可作為引數進行傳遞用於回撥,block 可以定義在方法裡,函式不能。block 語法簡單,寫在方法裡可以訪問區域性變數可以使程式碼更加的緊湊,結構化。相對於 delegate,block 不用建立代理協議,它的實現具有封閉性(closure),而又能夠很容易獲取上下文的相關狀態資訊,使用簡單。

用途:常用於逆向傳值、作為方法引數、作為類的屬性、作為全域性變數

注意:

1)在使用block前需要對block指標做判空處理。不判空直接使用,一旦指標為空直接產生崩潰。

2)在block使用之後要對,block指標做賦空值處理,如果是MRC的編譯環境下,要先release掉block物件。block作為類物件的成員變數,使用block的人有可能用類物件參與block中的運算而產生迴圈引用。將block賦值為空,是解掉迴圈引用的重要方法。(不能只在dealloc裡面做賦空值操作,這樣已經產生的迴圈引用不會被破壞掉)

3)使用方將self或成員變數加入block之前要先將self變為__weak

4)在多執行緒環境下(block中的weakSelf有可能被析構的情況下),需要先將self轉為strong指標,避免在執行到某個關鍵步驟時self物件被析構。

5)在MRC的編譯環境下,block如果作為成員引數要copy一下將棧上的block拷貝到堆上 

意義:Block是iOS4.0+ 和Mac OS X 10.6+ 引進的對C語言的擴充套件,用來實現匿名函式的特性。它允許開發者在兩個物件之間將任意的語句當做資料進行傳遞,往往這要比引用定義在別處的函式直觀;

3. 通知:NSnotification 一箇中心物件註冊和傳送通知,所用的其他的物件都可以收到通知。

用途:常常用於在向伺服器端請求資料或者提交資料的場景,在和伺服器端成功互動後,需要處理伺服器端返回的資料,或傳送響應訊息等
注意:它是同步的訊息通知機制,只有Observer將訊息處理完畢後,訊息傳送者才會繼續執行,因此在通知處理的地方做大量耗時操作的話,就會帶來卡頓的問題啦。

在多執行緒的應用中,Notification在哪個執行緒中Post, 就是在那個執行緒分發,也就在同一個執行緒中被observer處理。而通常呢,我們會在Observer物件的dealloc方法中去removeObserver,理論上,如果observer的dealloc和訊息傳送者的postNotification的方法在不同的執行緒中呼叫的話,是有可能會導致Crash的。

意義:廣播資料,一對多

4.KVC:鍵-值編碼是用於間接訪問物件屬性的機制,並不需要呼叫 set 或者 get 方法訪問變數,是通過 set value for key 進行間接訪問例項變數。