代理和Block - 類(lèi)之間相互傳遞的小紙條

小知識(shí):


? ? 在iOS開(kāi)發(fā)中曙求,我們經(jīng)常遇到的delegate忿偷,就是通常所說(shuō)的代理(或者協(xié)議),通過(guò)借助于protocol來(lái)定義仿荆,這是iOS中一種消息傳遞的方式贰您,也可以通過(guò)這種方式來(lái)傳遞一些參數(shù)坏平。是一種通用的設(shè)計(jì)模式,iOS中對(duì)代理支持的很好锦亦,由代理對(duì)象舶替、委托者、協(xié)議三部分組成杠园。通俗一點(diǎn)講代理的實(shí)現(xiàn)就好比一個(gè)嬰兒并不會(huì)自己給自己洗澡顾瞪,只有通過(guò)讓媽媽或者保姆或者老師來(lái)給嬰兒洗澡,這一過(guò)程就是代理的整個(gè)實(shí)現(xiàn)過(guò)程抛蚁,這里的嬰兒陈醒,媽媽?zhuān)D愤€有老師都是一個(gè)類(lèi),而代理也就是類(lèi)與類(lèi)之間的溝通對(duì)話或者說(shuō)是一種傳遞消息的方式瞧甩。至于Block也都屬于類(lèi)之間傳遞消息的方式钉跷。

? ? 但是,消息的傳遞也分種類(lèi)肚逸,比如最常用的就是傳值了爷辙,還有就是傳對(duì)象,傳方法朦促,這里的傳方法的意思就是膝晾,我不能做的事情交給你來(lái)做,可能需要你把做完事情的結(jié)果回傳給我务冕,也有可能是你做完了就是做完了血当,不用告訴我。

? ? 與代理不同的是禀忆,Block比代理更加輕型臊旭,使用更簡(jiǎn)單,能夠直接訪問(wèn)上下文油湖,這樣類(lèi)中不需要存儲(chǔ)臨時(shí)數(shù)據(jù)巍扛,使用 Block 的代碼通常會(huì)在同一個(gè)地方领跛,這樣讀代碼也連貫乏德。但是Block使用的不恰當(dāng),會(huì)造成導(dǎo)致循環(huán)引用吠昭,內(nèi)存無(wú)法釋放喊括。

Block的定義格式

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

};

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

block變量名(實(shí)參);


? ? ?下面來(lái)說(shuō)說(shuō)Block的實(shí)現(xiàn)方法,Block通過(guò)將一段代碼在運(yùn)行中保存矢棚,用來(lái)封裝和保存代碼郑什,有點(diǎn)像函數(shù),Block可以在任何時(shí)候執(zhí)行蒲肋。也通俗點(diǎn)說(shuō)就是將一個(gè)代碼塊放在堆區(qū)里蘑拯,在引用的時(shí)候?qū)⑦@塊代碼的地址傳過(guò)去钝满,然后給參數(shù),執(zhí)行代碼申窘。

使用場(chǎng)景:


? ? ?在較多情況下弯蚜,優(yōu)先考慮使用Block,而有兩個(gè)情況可以考慮 delegate :

1.有多個(gè)相關(guān)方法剃法。假如每個(gè)方法都設(shè)置一個(gè) block, 這樣會(huì)更麻煩碎捺。而 delegate 讓多個(gè)方法分成一組,只需要設(shè)置一次贷洲,就可以多次回調(diào)收厨。當(dāng)多于 3 個(gè)方法時(shí)就應(yīng)該優(yōu)先采用 delegate。

? ?比如一個(gè)網(wǎng)絡(luò)類(lèi)优构,假如只有成功和失敗兩種情況诵叁,每個(gè)方法可以設(shè)計(jì)成單獨(dú) block。但假如存在多個(gè)方法钦椭,比如有成功黎休、失敗、緩存玉凯、https 驗(yàn)證势腮,網(wǎng)絡(luò)進(jìn)度等等,這種情況下漫仆,delegate 就要比 block 要好捎拯。

? ?在 swift 中,利用 enum,? 多個(gè)方法也可以合并成一個(gè) block 接口盲厌。swift 中的枚舉根據(jù)情況不同署照,可以關(guān)聯(lián)不同數(shù)據(jù)類(lèi)型。而在 objc 就不建議這樣做吗浩,objc 這種情況下建芙,額外數(shù)據(jù)需要使用 NSObject 或者 字典進(jìn)行強(qiáng)轉(zhuǎn),接口就不夠安全懂扼。

2.為了避免循環(huán)引用禁荸,也可以使用 delegate。使用 block 時(shí)稍微不注意就形成循環(huán)引用阀湿,導(dǎo)致對(duì)象釋放不了赶熟。這種循環(huán)引用,一旦出現(xiàn)就比較難檢查出來(lái)陷嘴。而 delegate 的方法是分離開(kāi)的映砖,并不會(huì)引用上下文,因此會(huì)更安全些灾挨。

? ?假如寫(xiě)一個(gè)庫(kù)供他人使用邑退,不清楚使用者的水平如何竹宋。這時(shí)為防止誤用,寧愿麻煩一些地技,笨一些逝撬,使用 delegate 來(lái)替代 block。


總結(jié):


? ? ?就好比高中時(shí)期那些年傳過(guò)的小紙條一樣乓土,類(lèi)與類(lèi)之間需要頭痛宪潮,對(duì)象與對(duì)象之間也需要溝通,因?yàn)闇贤ú拍軐⒁患虑樽龊萌に眨砗虰lock就是溝通中最常用的方式或者說(shuō)工具狡相,而活用這些工具才會(huì)使溝通變的有效率,最后以上都是個(gè)人的一些胡說(shuō)八道食磕,有什么錯(cuò)的地方歡迎打臉指正尽棕,請(qǐng)給我一個(gè)改過(guò)自我的機(jī)會(huì)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末彬伦,一起剝皮案震驚了整個(gè)濱河市滔悉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌单绑,老刑警劉巖回官,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異搂橙,居然都是意外死亡歉提,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)区转,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)苔巨,“玉大人,你說(shuō)我怎么就攤上這事废离≈对螅” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵蜻韭,是天一觀的道長(zhǎng)悼尾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)湘捎,這世上最難降的妖魔是什么诀豁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任窄刘,我火速辦了婚禮窥妇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娩践。我一直安慰自己活翩,他們只是感情好烹骨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著材泄,像睡著了一般沮焕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拉宗,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天峦树,我揣著相機(jī)與錄音,去河邊找鬼旦事。 笑死魁巩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姐浮。 我是一名探鬼主播谷遂,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼卖鲤!你這毒婦竟也來(lái)了肾扰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛋逾,失蹤者是張志新(化名)和其女友劉穎集晚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體区匣,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甩恼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沉颂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片条摸。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖铸屉,靈堂內(nèi)的尸體忽然破棺而出钉蒲,到底是詐尸還是另有隱情,我是刑警寧澤彻坛,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布顷啼,位于F島的核電站,受9級(jí)特大地震影響昌屉,放射性物質(zhì)發(fā)生泄漏钙蒙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一间驮、第九天 我趴在偏房一處隱蔽的房頂上張望躬厌。 院中可真熱鬧,春花似錦竞帽、人聲如沸扛施。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疙渣。三九已至匙奴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妄荔,已是汗流浹背泼菌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啦租,地道東北人灶轰。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像刷钢,于是被迫代替她去往敵國(guó)和親笋颤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

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