block 和 delegate

block 和 delegate 都可以通知外面倘零。block 更輕型,使用更簡單戳寸,能夠直接訪問上下文呈驶,這樣類中不需要存儲臨時數(shù)據(jù),使用 block 的代碼通常會在同一個地方疫鹊,這樣讀代碼也連貫俐东。delegate 更重一些,需要實現(xiàn)接口订晌,它的方法分離開來虏辫,很多時候需要存儲一些臨時數(shù)據(jù),另外相關(guān)的代碼會被分離到各處锈拨,沒有 block 好讀砌庄。

應(yīng)該優(yōu)先使用 block。而有兩個情況可以考慮 delegate奕枢。

1. 有多個相關(guān)方法娄昆。假如每個方法都設(shè)置一個 block, 這樣會更麻煩。而 delegate 讓多個方法分成一組缝彬,只需要設(shè)置一次萌焰,就可以多次回調(diào)。當(dāng)多于 3 個方法時就應(yīng)該優(yōu)先采用 delegate谷浅。

比如一個網(wǎng)絡(luò)類扒俯,假如只有成功和失敗兩種情況,每個方法可以設(shè)計成單獨 block一疯。但假如存在多個方法撼玄,比如有成功、失敗墩邀、緩存掌猛、https 驗證,網(wǎng)絡(luò)進度等等眉睹,這種情況下荔茬,delegate 就要比 block 要好。

在 swift 中竹海,利用 enum,? 多個方法也可以合并成一個 block 接口慕蔚。swift 中的枚舉根據(jù)情況不同,可以關(guān)聯(lián)不同數(shù)據(jù)類型站削。而在 objc 就不建議這樣做坊萝,objc 這種情況下孵稽,額外數(shù)據(jù)需要使用 NSObject 或者 字典進行強轉(zhuǎn)许起,接口就不夠安全十偶。

2. 為了避免循環(huán)引用,也可以使用 delegate园细。使用 block 時稍微不注意就形成循環(huán)引用惦积,導(dǎo)致對象釋放不了。這種循環(huán)引用猛频,一旦出現(xiàn)就比較難檢查出來狮崩。而 delegate 的方法是分離開的,并不會引用上下文鹿寻,因此會更安全些睦柴。

假如寫一個庫供他人使用,不清楚使用者的水平如何毡熏。這時為防止誤用坦敌,寧愿麻煩一些,笨一些痢法,使用 delegate 來替代 block狱窘。

將 block 簡單分類,有三種情形财搁。

* 臨時性的蘸炸,只用在棧當(dāng)中,不會存儲起來尖奔。

比如數(shù)組的 foreach 遍歷搭儒,這個遍歷用到的 block 是臨時的,不會存儲起來提茁。

* 需要存儲起來仗嗦,但只會調(diào)用一次,或者有一個完成時期甘凭。

比如一個 UIView 的動畫稀拐,動畫完成之后,需要使用 block 通知外面丹弱,一旦調(diào)用 block 之后德撬,這個 block 就可以刪掉。

* 需要存儲起來躲胳,可能會調(diào)用多次蜓洪。

比如按鈕的點擊事件,假如采用 block 實現(xiàn)坯苹,這種 block 就需要長期存儲隆檀,并且會調(diào)用多次。調(diào)用之后,block 也不可以刪除恐仑,可能還有下一次按鈕的點擊泉坐。

對于臨時性的,只在棧中使用的 block, 沒有循環(huán)引用問題裳仆,block 會自動釋放腕让。而只調(diào)用一次的 block,需要看內(nèi)部的實現(xiàn)歧斟,正確的實現(xiàn)應(yīng)該是 block 調(diào)用之后纯丸,馬上賦值為空,這樣 block 也會釋放静袖,同樣不會循環(huán)引用觉鼻。

而多次調(diào)用時,block 需要長期存儲队橙,就很容易出現(xiàn)循環(huán)引用問題滑凉。

Cocoa 中的 API 設(shè)計也是這樣的,臨時性的喘帚,只會調(diào)用一次的畅姊,采用 block。而多次調(diào)用的吹由,并不會使用 block若未。比如按鈕事件,就使用 target-action倾鲫。有些庫將按鈕事件從 target-action 封裝成 block 接口, 反而容易出問題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粗合,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乌昔,更是在濱河造成了極大的恐慌隙疚,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磕道,死亡現(xiàn)場離奇詭異供屉,居然都是意外死亡,警方通過查閱死者的電腦和手機溺蕉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門伶丐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疯特,你說我怎么就攤上這事哗魂。” “怎么了漓雅?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵录别,是天一觀的道長朽色。 經(jīng)常有香客問我,道長组题,這世上最難降的妖魔是什么葫男? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮往踢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徘层。我一直安慰自己峻呕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布趣效。 她就那樣靜靜地躺著瘦癌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪跷敬。 梳的紋絲不亂的頭發(fā)上讯私,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音西傀,去河邊找鬼斤寇。 笑死,一個胖子當(dāng)著我的面吹牛拥褂,可吹牛的內(nèi)容都是我干的娘锁。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼饺鹃,長吁一口氣:“原來是場噩夢啊……” “哼莫秆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悔详,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤镊屎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后茄螃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缝驳,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年归苍,在試婚紗的時候發(fā)現(xiàn)自己被綠了党巾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡霜医,死狀恐怖齿拂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肴敛,我是刑警寧澤署海,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布吗购,位于F島的核電站,受9級特大地震影響砸狞,放射性物質(zhì)發(fā)生泄漏捻勉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一刀森、第九天 我趴在偏房一處隱蔽的房頂上張望踱启。 院中可真熱鬧,春花似錦研底、人聲如沸埠偿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冠蒋。三九已至,卻和暖如春乾胶,著一層夾襖步出監(jiān)牢的瞬間抖剿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工识窿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斩郎,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓喻频,卻偏偏與公主長得像孽拷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子半抱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容