之前面試遇到有問這樣的問題,我的回答可能比較片面,不夠深入。
下面是我的回答(不善言談的我):
“代理和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類。