iOS代理模式

概述

代理模式是一種消息傳遞方式基矮,一個完整的代理模式包括:委托對象、代理對象和協(xié)議冠场。

名詞解釋

  • 協(xié)議:用來指定代理雙方可以做什么家浇,必須做什么。
  • 委托對象:根據(jù)協(xié)議指定代理對象需要完成的事碴裙,即調(diào)用協(xié)議中的方法钢悲。
  • 代理對象:根據(jù)協(xié)議實現(xiàn)委托方需要完成的事点额,即實現(xiàn)協(xié)議中的方法。

1.Protocol-協(xié)議

從上圖中我們可以看到三方之間的關系莺琳,在實際應用中通過協(xié)議來規(guī)定代理雙方的行為还棱,協(xié)議中的內(nèi)容一般都是方法列表,當然也可以定義屬性惭等,我會在后續(xù)文章中順帶講一下協(xié)議中定義屬性珍手。

協(xié)議是公共的定義,如果只是某個類使用辞做,我們常做的就是寫在某個類中琳要。如果是多個類都是用同一個協(xié)議,建議創(chuàng)建一個Protocol文件凭豪,在這個文件中定義協(xié)議焙蹭。遵循的協(xié)議可以被繼承,例如我們常用的UITableView嫂伞,由于繼承自UIScrollView的緣故孔厉,所以也將UIScrollViewDelegate繼承了過來,我們可以通過代理方法獲取UITableView偏移量等狀態(tài)參數(shù)帖努。

協(xié)議只能定義公用的一套接口撰豺,類似于一個約束代理雙方的作用。但不能提供具體的實現(xiàn)方法拼余,實現(xiàn)方法需要代理對象去實現(xiàn)污桦。協(xié)議可以繼承其他協(xié)議,并且可以繼承多個協(xié)議匙监,在iOS中對象是不支持多繼承的凡橱,而協(xié)議可以多繼承。

@interface TMGameViewControllerNew ()<ILVLiveAVListener,ILVLiveIMListener,AVAudioPlayerDelegate,TMGameViewModelDelegate,TMGameShowViewProcotol,TMGameControlViewDelegate,QAVChangeDelegate,CAAnimationDelegate,TMMsgTooBarDelegate,UINavigationControllerDelegate>{
    NSInteger _chargeSource;
    BOOL _firstComeRoom;
    BOOL _firstGuideCamera;
}

2.委托對象

if ([self.delegate respondsToSelector:@selector(userLoginWithUsername:password:)]) {
      // 調(diào)用代理對象的登錄方法亭姥,代理對象去實現(xiàn)登錄方法
      [self.delegate userLoginWithUsername:self.username.text password:self.password.text];
  }


3.代理對象

    self.gameView = [[TMGameView alloc]initWithFrame:self.view.frame parentVC:self viewModel:self.gameViewModel];
    self.gameView.avIsLoad = NO;
    self.gameView.showView.delegate = self;
    self.gameView.controlView.delegate = self;
    self.gameView.msgToolBar.delegate = self;
/**
 *  代理方實現(xiàn)具體登錄細節(jié)
 */
- (void)userLoginWithUsername:(NSString *)username password:(NSString *)password {
    NSLog(@"username : %@, password : %@", username, password);
}


4. 代理屬性使用weak

  • 首先
    在我們的tableViewController中稼钩,控制器的view就是tableView,這就相當于tableViewController強引用著tableView(代理對象)达罗。
  • 然后
    當我們設置delegate的時候坝撑,一般都是讓tableViewController成為代理,這個時候代理如果也使用strong粮揉,那么tableView的delegate又強引用著tableViewController巡李,所以導致循環(huán)引用,因此代理得用weak扶认!
  • 為什么不用assign
    weak和assign是一種“非擁有關系”的指針侨拦,通過這兩種修飾符修飾的指針變量,都不會改變被引用對象的引用計數(shù)蝠引。但是在一個對象被釋放后阳谍,weak會自動將指針指向nil蛀柴,而assign則不會螃概。在iOS中矫夯,向nil發(fā)送消息時不會導致崩潰的,所以assign就會導致野指針的錯誤unrecognized selector sent to instance吊洼。

5.代理與block對比

  • 在有多個消息傳遞時训貌,用delegate實現(xiàn)更合適,看起來也更清晰冒窍。block就不太好了递沪,這個時候block反而不便于維護,而且看起來非常臃腫综液,很別扭款慨。
  • 代理更加面相過程,block則更面向結(jié)果谬莹。
    從設計模式的角度來說檩奠,代理更佳面向過程,而block更佳面向結(jié)果附帽。例如我們使用NSXMLParserDelegate代理進行XML解析埠戳,NSXMLParserDelegate中有很多代理方法,NSXMLParser會不間斷調(diào)用這些方法將一些轉(zhuǎn)換的參數(shù)傳遞出來蕉扮,這就是NSXMLParser解析流程整胃,這些通過代理來展現(xiàn)比較合適。而例如一個網(wǎng)絡請求回來喳钟,就通過success屁使、failure代碼塊來展示就比較好。
  • 從性能上來說奔则,block的性能消耗要略大于delegate蛮寂,因為block會涉及到棧區(qū)向堆區(qū)拷貝等操作,時間和空間上的消耗都大于代理应狱。而代理只是定義了一個方法列表共郭,在遵守協(xié)議對象的objc_protocol_list中添加一個節(jié)點,在運行時向遵守協(xié)議的對象發(fā)送消息即可疾呻。

相關參考:
http://www.reibang.com/p/2113ffe54b30

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末除嘹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子岸蜗,更是在濱河造成了極大的恐慌尉咕,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件璃岳,死亡現(xiàn)場離奇詭異年缎,居然都是意外死亡悔捶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門单芜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜕该,“玉大人,你說我怎么就攤上這事洲鸠√玫” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵扒腕,是天一觀的道長绢淀。 經(jīng)常有香客問我,道長瘾腰,這世上最難降的妖魔是什么皆的? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蹋盆,結(jié)果婚禮上费薄,老公的妹妹穿的比我還像新娘。我一直安慰自己怪嫌,他們只是感情好义锥,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岩灭,像睡著了一般拌倍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上噪径,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天柱恤,我揣著相機與錄音,去河邊找鬼找爱。 笑死梗顺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的车摄。 我是一名探鬼主播寺谤,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吮播!你這毒婦竟也來了变屁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤意狠,失蹤者是張志新(化名)和其女友劉穎粟关,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體环戈,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡闷板,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年澎灸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遮晚。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡性昭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鹏漆,到底是詐尸還是另有隱情巩梢,我是刑警寧澤创泄,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布艺玲,位于F島的核電站,受9級特大地震影響鞠抑,放射性物質(zhì)發(fā)生泄漏饭聚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一搁拙、第九天 我趴在偏房一處隱蔽的房頂上張望秒梳。 院中可真熱鬧,春花似錦箕速、人聲如沸酪碘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兴垦。三九已至,卻和暖如春字柠,著一層夾襖步出監(jiān)牢的瞬間探越,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工窑业, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钦幔,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓常柄,卻偏偏與公主長得像鲤氢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子西潘,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

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