協(xié)議代理,block的區(qū)別

之前面試遇到有問這樣的問題,我的回答可能比較片面,不夠深入。

下面是我的回答(不善言談的我):

“代理和block的共同特性是回調(diào)機(jī)制,不同的是,代理的方法比較多,比較分散。

使用block的代碼比較集中統(tǒng)一?!?/p>


我在網(wǎng)上搜了搜有以下結(jié)論:

代理的好處:

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ì)象,只要接受,只要允許,只要遵守了相關(guān)的協(xié)議,TA就可以使用代理(感謝http://www.itdecent.cn/users/22fefaea871c同學(xué)指出錯(cuò)誤);

2,代理更注重過程信息的傳輸:比如發(fā)起一個(gè)網(wǎng)絡(luò)請(qǐng)求,可能想要知道此時(shí)請(qǐng)求是否已經(jīng)開始、是否收到了數(shù)據(jù)、數(shù)據(jù)是否已經(jīng)接受完成、數(shù)據(jù)接收失敗

block:

1:寫法更簡(jiǎn)練,不需要寫protocol、函數(shù)等等

2,block注重結(jié)果的傳輸:比如對(duì)于一個(gè)事件,只想知道成功或者失敗,并不需要知道進(jìn)行了多少或者額外的一些信息

3,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];

}];

*什么時(shí)候用代理,什么時(shí)候用block

公共接口,方法較多也選擇用delegate進(jìn)行解耦

iOS有很多例子比如最常用tableViewDelegate,textViewDelegate

異步和簡(jiǎn)單的回調(diào)用block更好

iOS有很多例子比如常用的網(wǎng)絡(luò)庫(kù)AFNetwork,ASIHTTP庫(kù),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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 設(shè)計(jì)模式 1.delegate和notification什么區(qū)別,什么情況使用? 2.描述一下KVO和KVC。 K...
    丶逐漸閱讀 2,025評(píng)論 3 2
  • 通知 : “一對(duì)多”,”多對(duì)一” 傳值 四個(gè)步驟: 1.發(fā)送通知 2.創(chuàng)建監(jiān)聽者 3.接收通知 4.移除監(jiān)聽者 使...
    lgvae閱讀 577評(píng)論 0 6
  • 目錄 屬性 修飾詞 循環(huán)引用 typeof與typedef 1. 屬性 objc所有類和對(duì)象都是c結(jié)構(gòu)體,cate...
    Ryan___閱讀 377評(píng)論 0 1
  • 轉(zhuǎn)自李峰峰博客 一、概述 閉包 = 一個(gè)函數(shù)「或指向函數(shù)的指針」+ 該函數(shù)執(zhí)行的外部的上下文變量「也就是自由變量」...
    Joshua520閱讀 1,104評(píng)論 0 0
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。。。 其實(shí)如果沒有APIManager這一層是沒法使用delegate的,畢竟多個(gè)單...
    yhtang閱讀 5,466評(píng)論 1 23

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