小知識:
? ? 在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ī)會。