Delegate

  • 代理屬于一種設(shè)計模式,跟通知相似,內(nèi)部發(fā)生的一些事情可以告訴別人
  • 通知屬于觀察者模式:一直在那盯著,一旦有人發(fā)出通知,就捕獲通知,執(zhí)行一系列的操作
  • 代理和通知這兩種模式都屬于數(shù)據(jù)傳遞

delegate

  • 代理一般使用_weak
  • 為了保證任何對象都可以做為代理,所以類型不要寫死,用_id


    Paste_Image.png
Warning:
  • 如果讓一個控件/控制器成為了代理,那么耦合性會特別強.表現(xiàn)為你離不開我,我離不開你.
  • 誰觸動了代理方法就把誰傳出去

代理方法的命名:

  • XXX發(fā)生了什么事情,就把誰(參數(shù))傳出去
    比如:
  • scrollView觸發(fā)了滾動事件,把scrollView傳出去


    Snip20150922_164.png
  • scrollView觸發(fā)了移動事件,把scrollView傳出去,在把對應(yīng)的參數(shù)傳出去


    Snip20150922_165.png

    .

代理設(shè)計模式的作用:

  • A對象監(jiān)聽B對象的一些行為,A成為B的代理
  • B對象想告訴A對象一些事情抠刺,A成為B的代理

代理設(shè)計模式的總結(jié):

  • 如果你想監(jiān)聽別人的一些行為包斑,那么你就要成為別人的代理
  • 如果你想告訴別人一些事情,那么就讓別人成為你的代理

代理設(shè)計模式的開發(fā)步驟

  1. 擬一份協(xié)議(協(xié)議名字的格式:控件名 + Delegate)
    在協(xié)議里面聲明一些代理方法(一般代理方法都是@optional)
  2. 聲明一個代理屬性:@property (nonatomic, weak) id<代理協(xié)議> delegate;
  3. 在內(nèi)部發(fā)生某些行為時渠欺,調(diào)用代理對應(yīng)的代理方法妹蔽,通知代理內(nèi)部發(fā)生什么事
  4. 設(shè)置代理:xxx.delegate = yyy;
  5. yyy對象遵守協(xié)議,實現(xiàn)代理方法

代理和通知的區(qū)別

  • 代理:1個對象只能告訴另1個對象發(fā)生了什么事
  • 通知:1個對象可以告訴N個對象發(fā)生了什么事

實例:

  • 現(xiàn)在有一個被封裝起來的點擊加載更多(clickUpLoadMore)的功能
  • 要實現(xiàn)的是:想在點擊點擊加載更多(clickUpLoadMore)后刷新新的數(shù)據(jù)

解放方案:

首先要擬一份協(xié)議:
  1. clickUpLoadMore中把寫出一個代理的成員屬性


    Paste_Image.png
  2. 寫一個協(xié)議必要的3項:
    2-1:由于是在@interface上面寫的所以要@class聲明這個類.
    2-2:@protocol 代理名稱(一般用類的全稱+Delegate)<NSObject>
    2-3:@optional: 寫一個需要實現(xiàn)的方法


    Paste_Image.png
  3. 在.m文件中的加載更多的方法中判斷下是否遵守了協(xié)議,如果遵守了協(xié)議,就可以使用代理中的方法.


    Paste_Image.png
  4. 讓控制器成為被封裝起來的clickUpLoadMore的_代理
    Paste_Image.png
  • 并且遵守協(xié)議


    Paste_Image.png
  1. 最后一步,就是實現(xiàn)代理中的方法即可


    Paste_Image.png

代理為什么要使用weak屬性

__Warning: 事例1:

  1. 控制器中有個retain強指著tableView
  2. tableView中的代理也是有個強指針的delegate
  3. 但此時tableView的代理是控制器,如果互相強引用的話就不會都不會死.


    Paste_Image.png

    __解決方案: 讓代理是weak(弱引用)就不會出現(xiàn)這種情況,如果不使用weak,可能導(dǎo)致控制器和代理永遠無法銷毀.

__Warning: 事例1:
1. 控制器中有個retain強指著tableView
2. tableView中的代理也是有個強指針的subViews
3. subViews中裝著footView 而像操控footView的話必須通過代理方法,(代理一般都是控制器)如果代理使用強引用的話,都不會死掉.
__所以要用weak,控制器外界如果沒有被強引用,其他的都會死掉.


Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挠将,一起剝皮案震驚了整個濱河市胳岂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舔稀,老刑警劉巖乳丰,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異内贮,居然都是意外死亡产园,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進店門夜郁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來什燕,“玉大人,你說我怎么就攤上這事竞端∈杭矗” “怎么了?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵婶熬,是天一觀的道長剑勾。 經(jīng)常有香客問我,道長赵颅,這世上最難降的妖魔是什么虽另? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮饺谬,結(jié)果婚禮上捂刺,老公的妹妹穿的比我還像新娘。我一直安慰自己募寨,他們只是感情好族展,可當我...
    茶點故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拔鹰,像睡著了一般仪缸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上列肢,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天恰画,我揣著相機與錄音宾茂,去河邊找鬼。 笑死拴还,一個胖子當著我的面吹牛跨晴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播片林,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼端盆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了费封?” 一聲冷哼從身側(cè)響起焕妙,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弓摘,沒想到半個月后访敌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡衣盾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了爷抓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片势决。...
    茶點故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蓝撇,靈堂內(nèi)的尸體忽然破棺而出果复,到底是詐尸還是另有隱情,我是刑警寧澤渤昌,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布虽抄,位于F島的核電站,受9級特大地震影響独柑,放射性物質(zhì)發(fā)生泄漏迈窟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一忌栅、第九天 我趴在偏房一處隱蔽的房頂上張望车酣。 院中可真熱鬧,春花似錦索绪、人聲如沸湖员。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娘摔。三九已至,卻和暖如春唤反,著一層夾襖步出監(jiān)牢的瞬間凳寺,已是汗流浹背鸭津。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留读第,地道東北人曙博。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像怜瞒,于是被迫代替她去往敵國和親父泳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,587評論 2 350

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