代理和Block - 類之間相互傳遞的小紙條

小知識:


? ? 在iOS開發(fā)中,我們經(jīng)常遇到的delegate,就是通常所說的代理(或者協(xié)議),通過借助于protocol來定義,這是iOS中一種消息傳遞的方式,也可以通過這種方式來傳遞一些參數(shù)。是一種通用的設(shè)計模式,iOS中對代理支持的很好,由代理對象、委托者、協(xié)議三部分組成。通俗一點講代理的實現(xiàn)就好比一個嬰兒并不會自己給自己洗澡,只有通過讓媽媽或者保姆或者老師來給嬰兒洗澡,這一過程就是代理的整個實現(xiàn)過程,這里的嬰兒,媽媽,保姆還有老師都是一個類,而代理也就是類與類之間的溝通對話或者說是一種傳遞消息的方式。至于Block也都屬于類之間傳遞消息的方式。

? ? 但是,消息的傳遞也分種類,比如最常用的就是傳值了,還有就是傳對象,傳方法,這里的傳方法的意思就是,我不能做的事情交給你來做,可能需要你把做完事情的結(jié)果回傳給我,也有可能是你做完了就是做完了,不用告訴我。

? ? 與代理不同的是,Block比代理更加輕型,使用更簡單,能夠直接訪問上下文,這樣類中不需要存儲臨時數(shù)據(jù),使用 Block 的代碼通常會在同一個地方,這樣讀代碼也連貫。但是Block使用的不恰當(dāng),會造成導(dǎo)致循環(huán)引用,內(nèi)存無法釋放。

Block的定義格式

返回值類型(^block變量名)(形參列表) = ^(形參列表) {

};

調(diào)用Block保存的代碼

block變量名(實參);


? ? ?下面來說說Block的實現(xiàn)方法,Block通過將一段代碼在運行中保存,用來封裝和保存代碼,有點像函數(shù),Block可以在任何時候執(zhí)行。也通俗點說就是將一個代碼塊放在堆區(qū)里,在引用的時候?qū)⑦@塊代碼的地址傳過去,然后給參數(shù),執(zhí)行代碼。

使用場景:


? ? ?在較多情況下,優(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)行強轉(zhuǎn),接口就不夠安全。

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

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


總結(jié):


? ? ?就好比高中時期那些年傳過的小紙條一樣,類與類之間需要頭痛,對象與對象之間也需要溝通,因為溝通才能將一件事情做好,而代理和Block就是溝通中最常用的方式或者說工具,而活用這些工具才會使溝通變的有效率,最后以上都是個人的一些胡說八道,有什么錯的地方歡迎打臉指正,請給我一個改過自我的機(jī)會。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,666評論 30 472
  • 禪與 Objective-C 編程藝術(shù) (Zen and the Art of the Objective-C C...
    GrayLand閱讀 1,865評論 1 10
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評論 19 139
  • 基礎(chǔ) 1. 為什么說Objective-C是一門動態(tài)的語言? 2. 講一下MVC和MVVM,MVP? 3. 為...
    波妞和醬豆子閱讀 3,558評論 0 46
  • 想寫點什么 卻不知從何說起 正如這思緒 想理 卻還亂 自知 早已不再是多愁善感的年紀(jì) 卻仍舊 在不該惆悵的時間里惆...
    毛毛蟲好友閱讀 170評論 0 2

友情鏈接更多精彩內(nèi)容