從 http://blog.csdn.net/vbirdbest/article/details/51878995 引用
1.共同的作用:
Block 和 Delegate中的方法都可以理解成回調(diào)函數(shù)欲鹏,當(dāng)某件事情發(fā)生的時(shí)候取執(zhí)行一段代碼片段
2.Block(代碼塊)
優(yōu)點(diǎn):是一種輕量級(jí)的回調(diào)狰挡,能夠直接訪問(wèn)上下文圈膏,使用塊的地方和塊的實(shí)現(xiàn)地方在同一個(gè)地方梧宫,使得代碼組織更加連貫
3.Delegate(代理)
相對(duì)來(lái)說(shuō)是重量級(jí)的回調(diào)届案,
缺點(diǎn):
- 因方法的聲明和實(shí)現(xiàn)分離開(kāi)來(lái)饭豹,代碼的連貫性不是很好
- 代理很多時(shí)候需要存儲(chǔ)一些臨時(shí)數(shù)據(jù)
優(yōu)點(diǎn):
- 代理的回調(diào)函數(shù)可以是一組多個(gè)函數(shù)蛇捌,在不同的時(shí)機(jī)調(diào)用不同的回調(diào)函數(shù)
4.如何選擇使用哪一種
當(dāng)回調(diào)函數(shù)多于3個(gè)的時(shí)候,采用代理比較好
使用代碼塊容易造成循環(huán)引用赫编,代理不會(huì)出現(xiàn)該問(wèn)題
其他情況下優(yōu)先考慮代碼塊
-
異步和簡(jiǎn)單的回調(diào)用block更好
Block分為三種: - 臨時(shí)性的巡蘸,只用在棧當(dāng)中,不會(huì)存儲(chǔ)起來(lái)擂送。 比如數(shù)組的 foreach 遍歷悦荒,這個(gè)遍歷用到的 block 是臨時(shí)的,不會(huì)存儲(chǔ)起來(lái)团甲。 - 需要存儲(chǔ)起來(lái),但只會(huì)調(diào)用一次黍聂,或者有一個(gè)完成時(shí)期躺苦。 比如一個(gè) UIView 的動(dòng)畫(huà)身腻,動(dòng)畫(huà)完成之后,需要使用 block 通知外面匹厘,一旦調(diào)用 block 之后嘀趟,這個(gè) block 就可以刪掉。 - 需要存儲(chǔ)起來(lái)愈诚,可能會(huì)調(diào)用多次她按。 比如按鈕的點(diǎn)擊事件,假如采用 block 實(shí)現(xiàn)炕柔,這種 block 就需要長(zhǎng)期存儲(chǔ)酌泰,并且會(huì)調(diào)用多次。調(diào)用之后匕累,block 也不可以刪除陵刹,可能還有下一次按鈕的點(diǎn)擊