通知
: 一對一 一對多 傳值
四個步驟:
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:
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。