共同點(diǎn)
Block 和 Delegate中的方法都可以理解成回調(diào)函數(shù),當(dāng)某件事情發(fā)生的時(shí)候取執(zhí)行一段代碼片段
block
block 更輕型,使用更簡(jiǎn)單,能夠直接訪問上下文,這樣類中不需要存儲(chǔ)臨時(shí)數(shù)據(jù)。
使用 block 的代碼通常會(huì)在同一個(gè)地方,這樣讀代碼也連貫。
另:block外部使用__week修飾會(huì)防止循環(huán)引用
但是在block里面在強(qiáng)引用一下是為了防止變量提前釋放(例如block里面有延遲調(diào)用的方法)
delegate
delegate 更重一些,需要實(shí)現(xiàn)接口,它的方法分離開來,很多時(shí)候需要存儲(chǔ)一些臨時(shí)數(shù)據(jù)。
另外相關(guān)的代碼會(huì)被分離到各處,沒有 block 好讀。
代理的回調(diào)函數(shù)可以是一組多個(gè)函數(shù),不同情況下調(diào)用不同的函數(shù)
推薦優(yōu)先使用block
推薦使用delegate情況
1、多個(gè)方法。設(shè)置一次,回調(diào)多個(gè)方法,比如tableview和textview的delegate
2、避免循環(huán)引用,delegate不會(huì)造成循環(huán)引用,但是block很容易造成循環(huán)引用,相比較更加安全
3、需要對(duì)不同狀態(tài)下的情況進(jìn)行處理,比如UIScrollView的開始滾動(dòng)、將要滾動(dòng)、滾動(dòng)結(jié)束等
block有三種情形
1、臨時(shí)性的,比如數(shù)組的遍歷,不會(huì)存儲(chǔ)
2,一次性的,比如UIView animation...只會(huì)調(diào)用一次
3,自己聲明的,比如按鈕事件block,這是多次調(diào)用的,會(huì)存儲(chǔ)下來(很容易造成循環(huán)引用)