通知
:?? “一對多”,”多對一” 傳值
四個步驟:
1.發(fā)送通知
2.創(chuàng)建監(jiān)聽者
3.接收通知
4.移除監(jiān)聽者
使用場景:
1- 很多控制器都需要知道一個事件氛谜,應該用通知;
2 - 相隔多層的兩個控制器之間跳轉(zhuǎn)
注意事項:
1, 一旦接收消息的對象多了韧骗,就難以控制了兔院,可能有你不希望的對象接受了消息并做了處理
2,創(chuàng)建了觀察者,在dealloc里面一定要移除谆吴;
-----------------------------------------------------------------------
代理
“一對一”倒源,對同一個協(xié)議,一個對象只能設置一個代理delegate
六個步驟:
1.聲明一個協(xié)議,定義代理方法
2. 遵循協(xié)議
3.設置一個代理對象
4.調(diào)用代理方法
5.給代理賦值
6.實現(xiàn)代理方法
注意事項:
1,單例對象不能用代理句狼;
2,代理執(zhí)行協(xié)議方法時要使用 respondsToSelector檢查其代理是否符合協(xié)議(檢查對象能否響應指定的消息),以避免代理在回調(diào)時因為沒有實現(xiàn)方法而造成程序崩潰
使用場景:
公共接口笋熬,方法較多也選擇用delegate進行解耦
iOS最常用tableViewDelegate,textViewDelegate
iOS有很多例子比如常用的網(wǎng)絡庫AFNetwork腻菇,ASIHTTP庫胳螟,UIAlertView類昔馋。
-----------------------------------------------------------------------
block
什么是Block:
Block是iOS4.0+ 和Mac OS X 10.6+ 引進的對C語言的擴展,用來實現(xiàn)匿名函數(shù)的特性糖耸。
Blocks語法塊代碼以閉包得形式將各種內(nèi)容進行傳遞秘遏,可以是代碼,可以是數(shù)組無所不能嘉竟。
閉包就是能夠讀取其它函數(shù)內(nèi)部變量的函數(shù)邦危。就是在一段請求連續(xù)代碼中可以看到調(diào)用參數(shù)(如發(fā)送請求)和響應結(jié)果。所以采用Block技術能夠抽象出很多共用函數(shù)舍扰,提高了代碼的可讀性倦蚪,可維護性,封裝性边苹。
使用場景:
一:動畫
二:數(shù)據(jù)請求回調(diào)
三:枚舉回調(diào)
四:多線程gcd
...
異步和簡單的回調(diào)用block更好
BLOCK最典型的是大所周知的AFNETWORK第三方庫陵且。
注意事項:
block需要注意防止循環(huán)引用:
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需要定義協(xié)議方法滩报,代理對象實現(xiàn)協(xié)議方法,并且需要建立代理關系才可以實現(xiàn)通信播急;
Block:Block更加簡潔,不需要定義繁瑣的協(xié)議方法售睹,但通信事件比較多的話桩警,建議使用Delegate;
3,? delegate運行成本低昌妹。block成本很高的捶枢。
block出棧需要將使用的數(shù)據(jù)從棧內(nèi)存拷貝到堆內(nèi)存,當然對象的話就是加計數(shù)飞崖,使用完或者block置nil后才消除烂叔;delegate只是保存了一個對象指針,直接回調(diào)固歪,沒有額外消耗蒜鸡。相對C的函數(shù)指針,只多做了一個查表動作 .
4牢裳,代理更注重過程信息的傳輸:比如發(fā)起一個網(wǎng)絡請求逢防,可能想要知道此時請求是否已經(jīng)開始、是否收到了數(shù)據(jù)蒲讯、數(shù)據(jù)是否已經(jīng)接受完成忘朝、數(shù)據(jù)接收失敗
block注重結(jié)果的傳輸:比如對于一個事件,只想知道成功或者失敗判帮,并不需要知道進行了多少或者額外的一些信息
5 Blocks 更清晰局嘁。比如 一個 viewController 中有多個彈窗事件溉箕,Delegate 就得對每個事件進行判斷識別來源。而 Blocks 就可以在創(chuàng)建事件的時候區(qū)分開來了悦昵。這也是為什么現(xiàn)在蘋果 API 中越來越多地使用 Blocks 而不是 Delegate肴茄。