通知/代理/block 三者作用對比


通知

: 一對一  一對多  傳值

四個步驟:
 1.發送通知
2.創建監聽者
3.接收通知
4.移除監聽者
        

使用場景:
1- 很多控制器都需要知道一個事件,應該用通知;
2 - 相隔多層的兩個控制器之間跳轉

注意事項:
  1, 一旦接收消息的對象多了,就難以控制了,可能有你不希望的對象接受了消息並做了處理
 2,創建了觀察者,在dealloc里面一定要移除;

—————————————————————————————————————————————————————————————

代理

“一對一”,對同一個協議,一個對象只能設置一個代理delegate


六個步驟:
1.聲明一個協議,定義代理方法
2. 遵循協議
3.設置一個代理對象
4.調用代理方法
5.給代理賦值
6.實現代理方法

注意事項:

1,單例對象不能用代理;
2,代理執行協議方法時要使用 respondsToSelector檢查其代理是否符合協議(檢查對象能否響應指定的消息),以避免代理在回調時因為沒有實現方法而造成程序崩潰



 使用場景:

公共接口,方法較多也選擇用delegate進行解耦
iOS最常用tableViewDelegate,textViewDelegate
 iOS有很多例子比如常用的網絡庫AFNetwork,ASIHTTP庫,UIAlertView類。


—————————————————————————————————————————————————————————————


block

什么是Block:

Block是iOS4.0+ 和Mac OS X 10.6+ 引進的對C語言的擴展,用來實現匿名函數的特性。
Blocks語法塊代碼以閉包得形式將各種內容進行傳遞,可以是代碼,可以是數組無所不能。

閉包就是能夠讀取其它函數內部變量的函數。就是在一段請求連續代碼中可以看到調用參數(如發送請求)和響應結果。所以采用Block技術能夠抽象出很多共用函數,提高了代碼的可讀性,可維護性,封裝性。



使用場景:
一:動畫
二:數據請求回調
三:枚舉回調
四:多線程gcd
...

 異步和簡單的回調用block更好
BLOCK最典型的是大所周知的AFNETWORK第三方庫。

注意事項:

block需要注意防止循環引用:
    ARC下這樣防止:
__weak typeof(self) weakSelf = self;
  [yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {
       [weakSelf doSomething];
    }];

     非ARC
__block typeof(self) weakSelf = self;
  [yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {
       [weakSelf doSomething];
    }];



———————————————————————————————————————————————————————————
delegate 和 block對比
 

    效率:Delegate比NSNOtification高;

 1,   Delegate和Block一般都是一對一的通信;


 2,   Delegate需要定義協議方法,代理對象實現協議方法,並且需要建立代理關系才可以實現通信;

      Block:Block更加簡潔,不需要定義繁瑣的協議方法,但通信事件比較多的話,建議使用Delegate;


3,  delegate運行成本低。block成本很高的。
block出棧需要將使用的數據從棧內存拷貝到堆內存,當然對象的話就是加計數,使用完或者block置nil后才消除;delegate只是保存了一個對象指針,直接回調,沒有額外消耗。相對C的函數指針,只多做了一個查表動作 .

4,代理更注重過程信息的傳輸:比如發起一個網絡請求,可能想要知道此時請求是否已經開始、是否收到了數據、數據是否已經接受完成、數據接收失敗
    block注重結果的傳輸:比如對於一個事件,只想知道成功或者失敗,並不需要知道進行了多少或者額外的一些信息


5 Blocks 更清晰。比如 一個 viewController 中有多個彈窗事件,Delegate 就得對每個事件進行判斷識別來源。而 Blocks 就可以在創建事件的時候區分開來了。這也是為什么現在蘋果 API 中越來越多地使用 Blocks 而不是 Delegate。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM