Block 與 代理

作者:黃兢成
鏈接:https://www.zhihu.com/question/29023547/answer/109570584
來源:知乎
著作權(quán)歸作者所有铐维,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)。

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ò)進(jìn)度等等滥崩,這種情況下,delegate 就要比 block 要好讹语。

在 swift 中钙皮,利用 enum, 多個方法也可以合并成一個 block 接口。swift 中的枚舉根據(jù)情況不同顽决,可以關(guān)聯(lián)不同數(shù)據(jù)類型短条。而在 objc 就不建議這樣做,objc 這種情況下才菠,額外數(shù)據(jù)需要使用 NSObject 或者 字典進(jìn)行強(qiáng)轉(zhuǎn)茸时,接口就不夠安全。

  1. 為了避免循環(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閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異筹我,居然都是意外死亡扶平,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蔬蕊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來结澄,“玉大人,你說我怎么就攤上這事岸夯÷橄祝” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵猜扮,是天一觀的道長勉吻。 經(jīng)常有香客問我,道長旅赢,這世上最難降的妖魔是什么齿桃? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮煮盼,結(jié)果婚禮上短纵,老公的妹妹穿的比我還像新娘。我一直安慰自己僵控,他們只是感情好香到,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著报破,像睡著了一般悠就。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上充易,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天梗脾,我揣著相機(jī)與錄音,去河邊找鬼蔽氨。 笑死藐唠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鹉究。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼踪宠,長吁一口氣:“原來是場噩夢啊……” “哼自赔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柳琢,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤绍妨,失蹤者是張志新(化名)和其女友劉穎润脸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體他去,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡毙驯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灾测。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爆价。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖媳搪,靈堂內(nèi)的尸體忽然破棺而出铭段,到底是詐尸還是另有隱情,我是刑警寧澤秦爆,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布序愚,位于F島的核電站,受9級特大地震影響等限,放射性物質(zhì)發(fā)生泄漏爸吮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一望门、第九天 我趴在偏房一處隱蔽的房頂上張望形娇。 院中可真熱鬧,春花似錦怒允、人聲如沸埂软。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勘畔。三九已至,卻和暖如春丽惶,著一層夾襖步出監(jiān)牢的瞬間炫七,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工钾唬, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留万哪,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓抡秆,卻偏偏與公主長得像奕巍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子儒士,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理的止,服務(wù)發(fā)現(xiàn),斷路器着撩,智...
    卡卡羅2017閱讀 134,716評論 18 139
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中诅福。匾委。。 其實如果沒有APIManager這一層是沒法使用delegate的氓润,畢竟多個單...
    yhtang閱讀 5,207評論 1 23
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,166評論 30 470
  • 禪與 Objective-C 編程藝術(shù) (Zen and the Art of the Objective-C C...
    GrayLand閱讀 1,632評論 1 10
  • 我的臉上 刻著所有 我愛的人的臉 誰能説 我醜赂乐? 早課抄了俄羅斯詩人維雅·庫普里揚諾夫的詩歌《臉》。在優(yōu)秀的詩人的...
    東豐林波閱讀 278評論 0 0