代理設計模式溫顧

前言

通過閱讀了劉小壯大神的博客你真的了解iOS代理設計模式嗎窗轩?對以前模糊的代理設計模式有了新的認識嗅回。略做記錄汞贸,供自己記憶崔兴。

iOS中消息傳遞的方式

  • 通知:由通知中心發(fā)送通知給通知的接受者,是一種一對多的消息傳遞方式
  • 代理:代理設計模式由代理藏否、協(xié)議瓶殃、委托三部分組成
  • 閉包:iOS4.0以后引入,block實質(zhì)是存儲了一段代碼塊內(nèi)存的指針
  • target action:通過將對象傳遞到另一個類中副签,在另一個類中將該對象當做target的方式遥椿,來調(diào)用該對象方法,從內(nèi)存角度來說和代理類似
  • KVO:通過監(jiān)聽某一個實例的某一個屬性值變化淆储,當那個屬性的值發(fā)送變化時冠场,會調(diào)用KVO的回調(diào)方法

代理的基本使用

代理主要由三個部分組成

  • 協(xié)議:協(xié)議就是填寫那些需要代理方執(zhí)行的方法
  • 委托:指定遵循協(xié)議的代理去完成方法
  • 代理:完成委托方委托的方法

在通常情況下我們都會吧協(xié)議寫在委托方的文件下,但是當多個類需要用到同一個協(xié)議時本砰,我們可以創(chuàng)建一個協(xié)議文件碴裙,protocol也是可以被繼承的(自己這只菜鳥不知道!)例如我們常用的UITableView,由于繼承自UIScrollView的緣故舔株,所以也將UIScrollViewDelegate繼承了過來莺琳,我們可以通過代理方法獲取UITableView偏移量等狀態(tài)參數(shù)。iOS中對象不支持多繼承载慈,但是協(xié)議可以多繼承

代理的原理

以前在給代理設置屬性的時候一直沿襲網(wǎng)上的assign寫法惭等,也不知道為什么這么寫,但是看了大神的文章才明其緣由办铡。原來安全的寫法應該是用weak辞做,在委托釋放的時候,代理對象也會跟著釋放寡具,從而不會造成循環(huán)引用的問題秤茅,而且也不會向野指針發(fā)送消息,從而引起程序奔潰晒杈。
 代理的本質(zhì)就是代理對象內(nèi)存的傳遞和操作嫂伞,我們在委托類設置代理對象后,實際上只是用一個id類型的指針將代理對象進行了一個弱引用拯钻。委托方讓代理方執(zhí)行操作帖努,實際上是在委托類中向這個id類型指針指向的對象發(fā)送消息,而這個id類型指針指向的對象粪般,就是代理對象拼余。
 其實委托方的代理屬性本質(zhì)上就是代理對象自身,設置委托代理就是代理屬性指針指向代理對象亩歹,相當于代理對象只是在委托方中調(diào)用自己的方法匙监,如果方法沒有實現(xiàn)就會導致崩潰。從崩潰的信息上來看小作,就可以看出來是代理方?jīng)]有實現(xiàn)協(xié)議中的方法導致的崩潰亭姥。

利用代理對控制器瘦身

優(yōu)化我們經(jīng)常使用的UITableView,核心思想就是通過繼承其代理顾稀,然后將原控制器的代理對象的方法全部挪到新的代理對象中去达罗,好像說的不是太清楚。静秆。粮揉。這樣就可以新建一個代理對象類,然后繼承UItabelView的delegate和datasource,然后在這個代理文件中執(zhí)行UItabelView的代理方法抚笔,這樣就可以把很多的代碼方法到這個新的代理對象中扶认,大大減輕主控制器中的代碼了。

知識補充

本渣渣完全不知道的東西↓
在iOS2.0之前還沒有引入@Protocol正式協(xié)議之前殊橙,實現(xiàn)協(xié)議的功能主要是通過給NSObject添加Category的方式辐宾。這種通過Category的方式狱从,相對于iOS2.0之后引入的@Protocol,就叫做非正式協(xié)議叠纹。

正如上面所說的矫夯,非正式協(xié)議一般都是以NSObject的Category的方式存在的。由于是對NSObject進行的Category吊洼,所以所有基于NSObject的子類,都接受了所定義的非正式協(xié)議制肮。對于@Protocol來說編譯器會在編譯期檢查語法錯誤冒窍,而非正式協(xié)議則不會檢查是否實現(xiàn)。

非正式協(xié)議中沒有@Protocol的@optional和@required之分豺鼻,和@Protocol一樣在調(diào)用的時候综液,需要進行判斷方法是否實現(xiàn)。

在iOS早期也使用了大量非正式協(xié)議儒飒,例如CALayerDelegate就是非正式協(xié)議的一種實現(xiàn)谬莹,非正式協(xié)議本質(zhì)上就是Category。

關(guān)于代理和block的區(qū)別

對于這個代理和block桩了,我更加喜歡使用block附帽,因為本渣渣懶哈,block使用比較簡單井誉。其實不然蕉扮,很多地方代理有很大的優(yōu)勢,當然block也一樣颗圣。

  • 當需要傳遞多個參數(shù)的時候喳钟,block看起來會非常的臃腫,而且條例不清晰在岂,但是用代理就非常合適了奔则,看起來也非常的清晰明了。
  • 代理對象只能擁有一個蔽午,如果你對一個委托方的代理對象重復賦值易茬,那代理對象只會是最后一個賦值的對象,其實就是屬性的重新賦值了祠丝。如果想要委托對象回調(diào)多個代理對象應該用block疾呻。(這里主要是針對于對象內(nèi)部屬性不會對block進行引用的情況下,否則再調(diào)用同一個方法也會造成重新賦值問題)上面這句話我也不是很清楚写半,但是博主在最后面寫的應該是block可以在多處調(diào)用岸蜗,就是說,可以在多住調(diào)用這個block內(nèi)部的代碼塊吧叠蝇。
  • 單例對象不要使用代理璃岳。
  • 無論是代理還是block在使用的時候都要先驗證其是否實現(xiàn)年缎。
  • 代理更加面向過程,但是block更加面向結(jié)果铃慷。如果當你的程序希望更注重過程時单芜,可以使用代理。當你覺得結(jié)果更加重要的時候犁柜,你可以使用block洲鸠。
  • 從性能上講,block更加耗性能一些馋缅,應為block會涉及沖棧區(qū)先堆區(qū)拷貝扒腕,所以在時間和空間上的消耗都是大于代理代碼。而代理只是定義了一個方法的列表萤悴。在自己的協(xié)議方法列表中添加了一個節(jié)點瘾腰。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市覆履,隨后出現(xiàn)的幾起案子蹋盆,更是在濱河造成了極大的恐慌,老刑警劉巖硝全,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栖雾,死亡現(xiàn)場離奇詭異,居然都是意外死亡柳沙,警方通過查閱死者的電腦和手機岩灭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赂鲤,“玉大人噪径,你說我怎么就攤上這事∈酰” “怎么了找爱?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泡孩。 經(jīng)常有香客問我车摄,道長,這世上最難降的妖魔是什么仑鸥? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任吮播,我火速辦了婚禮,結(jié)果婚禮上眼俊,老公的妹妹穿的比我還像新娘意狠。我一直安慰自己,他們只是感情好疮胖,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布环戈。 她就那樣靜靜地躺著闷板,像睡著了一般。 火紅的嫁衣襯著肌膚如雪院塞。 梳的紋絲不亂的頭發(fā)上遮晚,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音拦止,去河邊找鬼县遣。 笑死,一個胖子當著我的面吹牛汹族,可吹牛的內(nèi)容都是我干的艺玲。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼鞠抑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了忌警?” 一聲冷哼從身側(cè)響起搁拙,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎法绵,沒想到半個月后箕速,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡朋譬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年盐茎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徙赢。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡字柠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狡赐,到底是詐尸還是另有隱情窑业,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布枕屉,位于F島的核電站常柄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏搀擂。R本人自食惡果不足惜西潘,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哨颂。 院中可真熱鬧喷市,春花似錦、人聲如沸咆蒿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缭黔,卻和暖如春食茎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背馏谨。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工别渔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惧互。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓哎媚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親喊儡。 傳聞我的和親對象是個殘疾皇子拨与,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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