代理Delegate、Block、通知的優(yōu)缺點(diǎn),Block和代理的區(qū)別?

代理

優(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類等

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容