之前面試遇到有問這樣的問題瞬沦,我的回答可能比較片面太伊,不夠深入。
下面是我的回答(不善言談的我):
“代理和block的共同特性是回調(diào)機制逛钻,不同的是僚焦,代理的方法比較多,比較分散曙痘。
使用block的代碼比較集中統(tǒng)一芳悲。”
我在網(wǎng)上搜了搜有以下結(jié)論:
代理的好處:
delegate運行成本低边坤。block成本很高的名扛。
block出棧需要將使用的數(shù)據(jù)從棧內(nèi)存拷貝到堆內(nèi)存,當然對象的話就是加計數(shù)茧痒,使用完或者block置nil后才消除肮韧;delegate只是保存了一個對象指針,直接回調(diào)旺订,沒有額外消耗弄企。相對C的函數(shù)指針,只多做了一個查表動作
delegate:
1区拳,“一對一”拘领,對同一個協(xié)議,一個對象只能設置一個代理delegate樱调,單例對象就不能用代理這是不對的?,任何人,任何對象,只要接受,只要允許,只要遵守了相關(guān)的協(xié)議,TA就可以使用代理(感謝http://www.reibang.com/users/22fefaea871c同學指出錯誤)约素;
2,代理更注重過程信息的傳輸:比如發(fā)起一個網(wǎng)絡請求笆凌,可能想要知道此時請求是否已經(jīng)開始业汰、是否收到了數(shù)據(jù)、數(shù)據(jù)是否已經(jīng)接受完成菩颖、數(shù)據(jù)接收失敗
block:
1:寫法更簡練样漆,不需要寫protocol、函數(shù)等等
2晦闰,block注重結(jié)果的傳輸:比如對于一個事件放祟,只想知道成功或者失敗,并不需要知道進行了多少或者額外的一些信息
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];
}];
*什么時候用代理跪妥,什么時候用block
公共接口,方法較多也選擇用delegate進行解耦
iOS有很多例子比如最常用tableViewDelegate声滥,textViewDelegate
異步和簡單的回調(diào)用block更好
iOS有很多例子比如常用的網(wǎng)絡庫AFNetwork眉撵,ASIHTTP庫侦香,UIAlertView類。