block 和 delegate 都可以通知外面。block 更輕型,使用更簡(jiǎn)單,能夠直接訪問上下文,這樣類中不需要存儲(chǔ)臨時(shí)數(shù)據(jù),使用 block 的代碼通常會(huì)在同一個(gè)地方,這樣讀代碼也連貫。delegate 更重一些,需要實(shí)現(xiàn)接口,它的方法分離開來,很多時(shí)候需要存儲(chǔ)一些臨時(shí)數(shù)據(jù),另外相關(guān)的代碼會(huì)被分離到各處,沒有 block 好讀。
應(yīng)該優(yōu)先使用 block。而有兩個(gè)情況可以考慮 delegate。
有多個(gè)相關(guān)方法。假如每個(gè)方法都設(shè)置一個(gè) block, 這樣會(huì)更麻煩。而 delegate 讓多個(gè)方法分成一組,只需要設(shè)置一次,就可以多次回調(diào)。當(dāng)多于 3 個(gè)方法時(shí)就應(yīng)該優(yōu)先采用 delegate。
為了避免循環(huán)引用,也可以使用 delegate。使用 block 時(shí)稍微不注意就形成循環(huán)引用,導(dǎo)致對(duì)象釋放不了。這種循環(huán)引用,一旦出現(xiàn)就比較難檢查出來。而 delegate 的方法是分離開的,并不會(huì)引用上下文,因此會(huì)更安全些。