代理
優(yōu)點(diǎn):
1.代理語法清晰,可讀性高,易于維護(hù)
2.它減少代碼耦合性,使事件監(jiān)聽與事件處理分離
3.一個(gè)控制器可以實(shí)現(xiàn)多個(gè)代理,滿足自定義開發(fā)需求,靈活性較高
缺點(diǎn):
1.實(shí)現(xiàn)代理的過程較繁瑣
2.跨層傳值時(shí)加大代碼的耦合性,并且程序的層次結(jié)構(gòu)也變得混亂
3.當(dāng)多個(gè)對(duì)象同時(shí)傳值時(shí)不易區(qū)分,導(dǎo)致代理易用性大大降低
Block
Block封裝一段代碼,并當(dāng)作變量進(jìn)行傳遞,它十分方便地將不同地方的代碼組織在一起,可讀性高
優(yōu)點(diǎn):
1.語法簡潔,代碼可讀性和維護(hù)性較高
2.配合GCD優(yōu)秀的解決多線程問題
缺點(diǎn):
1.Block中得代碼將自動(dòng)進(jìn)行一次retain操作,容易造成內(nèi)存泄漏
2.Block內(nèi)默認(rèn)引用為強(qiáng)引用,容易造成循環(huán)應(yīng)用
通知
代理是一對(duì)一的關(guān)系,通知是一對(duì)多的關(guān)系,通知相比代理可以實(shí)現(xiàn)更大跨度的通信機(jī)制,但接收對(duì)象多了,就難以控制,有時(shí)不希望的對(duì)象也接收處理了信息
優(yōu)點(diǎn):
1.使用簡單,代碼精簡
2.支持一對(duì)多,解決同時(shí)向多個(gè)對(duì)象監(jiān)聽的問題
3.傳值方便快捷,context自帶攜帶相應(yīng)的內(nèi)容
缺點(diǎn):
1.通知使用完畢后需要注銷,否則會(huì)造成意外崩潰
2.key不夠安全,編譯器不會(huì)檢測到是否被通知中心處理
3.調(diào)試時(shí)難以跟蹤
4.當(dāng)使用者向通知中心發(fā)送通知的時(shí)候,并不能獲得任何反饋信息
5.需要一個(gè)第三方的對(duì)象來做監(jiān)聽與被監(jiān)聽者的中介
Block和Delegate的區(qū)別?
delegate運(yùn)行成本低,block成本高
block出棧需要將使用的數(shù)據(jù)從棧內(nèi)存拷貝到堆內(nèi)存,當(dāng)然對(duì)象的話就是加計(jì)數(shù),使用完或者block置 nil 后才消除;delegate只是保存了一個(gè)對(duì)象指針,直接回調(diào),沒有額外消耗,相對(duì)C的函數(shù)指針,只做了一個(gè)查表的動(dòng)作
Delegate:
1.“一對(duì)一”,對(duì)同一個(gè)協(xié)議,一個(gè)對(duì)象只能設(shè)置一個(gè)代理delegate,單例對(duì)象就不能用代理這是不對(duì)的,任何人,任何對(duì)象,只要接受,只要運(yùn)行,只要遵守了相關(guān)的協(xié)議,他就可以使用代理
2.代理更注重過程信息的傳輸:比如發(fā)起一個(gè)網(wǎng)絡(luò)請(qǐng)求,可能想要知道此時(shí)請(qǐng)求是否已經(jīng)開始,是否收到了數(shù)據(jù),數(shù)據(jù)是否已經(jīng)接受完成、數(shù)據(jù)接收失敗
Block:
1.寫法更簡練,不需要Protocol、函數(shù)等
2.block注重結(jié)果的傳輸:比如對(duì)于一個(gè)事件,只想知道成功或者失敗,并不需要知道進(jìn)行了多少或者額外的一些信息
3.Block需要注意防止循環(huán)引用:
ARC下:
__weak typeof(self) weakSelf = self;
[your Block:^(NSArray *repeatedArray,NSArray *incompleteArray){
[weakSelf doSomething];
}];
非ARC:
__block typeof(self) weakSelf = self;
[your Block:^(NSArray *repeatedArray,NSArray *incompleteArray){
[weakSelf doSomething];
}];
什么時(shí)候用代理,什么時(shí)候用Block
公共接口,方法較多也選擇用delegate進(jìn)行解耦
iOS有很多例子,比如最常用tableViewDelegate,textViewDelegate
異步和簡單的回調(diào)用block更高
iOS有很多例子比如常用的網(wǎng)絡(luò)庫AFNetworking,ASIHttps庫,UIAlertView類等