iOS 委托代理與協(xié)議(Delegate and Protocol)

在說之前珊皿,先說明protocol和delegate完全不是一回事,放在一起說巨税,只是因?yàn)槲覀兘?jīng)常在同一個頭文件里看到這兩個word蟋定。

委托(代理模式)(Delegate):顧名思義就是委托別人辦事,就是當(dāng) 一件事情發(fā)生后草添,自己不處理驶兜,讓別人來處理。

協(xié)議 (Protocol):就是使用了這個協(xié)議后就要按照這個協(xié)議來辦事远寸,協(xié)議要求實(shí)現(xiàn)的方法就一定要實(shí)現(xiàn)批什。

就是我有一個任務(wù)完成一個app 我只會寫iOS端的前臺璧尸,我需要找人寫后臺腻窒,即委托(Delegate)人寫后臺懊烤,我倆合作時要有個協(xié)議(Protocol),完成之后各分多少錢倡怎。迅耘。。


?協(xié)議(Protocol)

protocol和java里interface的概念類似监署,是Objective-C語法的一部分颤专。(其實(shí)我跟不不知道什么java的interface,喵)

定義protocol如下

@protocol ClassADelegate

-(void)methodA;

-(void)methodB;

@end

那么就是定義了一組函數(shù)钠乏,這組函數(shù)放在一起叫作一個protocol栖秕,也就是協(xié)議。

函數(shù)是需要被實(shí)現(xiàn)的晓避,所以如果對于class如下

@interface ClassB<ClassADelegate>{

}

@end

就叫作ClassB conform to protocol ClassADelegate簇捍,也就是說ClassB實(shí)現(xiàn)了這個協(xié)議,

也就是實(shí)現(xiàn)了這一組函數(shù)俏拱。

有了上面這個頭文件暑塑,我們就可以放心作調(diào)用

ClassB*b=[[ClassB alloc]init];

[b methodA];

[b methodB];

而不用擔(dān)心出現(xiàn)unrecognized selector sent to instance這種錯誤了。

所以protocol就是一組函數(shù)定義锅必,是從類聲明中剝離出來的一組定義事格。

id<ClassADelegate>b=...;

[b methodA];

這種用法也常見,b是一個id類型搞隐,它知道ClassADelegate這組函數(shù)的實(shí)現(xiàn)驹愚。


委托(Delegate)

Delegate本身應(yīng)該稱為一種設(shè)計模式。

是把一個類自己需要做的一部分事情劣纲,讓另一個類(也可以就是自己本身)來完成逢捺。

就是調(diào)用自己定義方法,別的類來實(shí)現(xiàn)癞季。比如ClassC

@interface ClassC{

id delegate;

}@end

那么ClassC的實(shí)現(xiàn)(.m文件)里就可以用delegate這個變量了劫瞳。

當(dāng)然這里完全可以用其它名字而不是delegate。

我們也可以這樣寫

@interface ClassC{

ClassB *delegate;

}@end

這樣我們知道了delegate是一個ClassB绷柒,它就可以提供ClassB里的方法柠新。

可以把一部分ClassC里的工作放在ClassB里去實(shí)現(xiàn)。

這樣的寫法看起來是不是有點(diǎn)奇怪辉巡?或者應(yīng)該寫成這樣恨憎?

@interface ClassC{

ClassB *classB;

}@end

delegate沒有了...

所以說其實(shí)delegate只是一種模式,大家約定俗成郊楣,當(dāng)把自己內(nèi)部一部分實(shí)現(xiàn)暴露給另外一個類去做的時候憔恳,就叫實(shí)際做事的類為delegate。

為什么會需要把內(nèi)部實(shí)現(xiàn)提出來給另一個類做呢净蚤?

最常見的目的就是為了在隱藏實(shí)現(xiàn)的前提下钥组,提供一個自定義的機(jī)會。

比如Apple提供的iOS SDK里就有眾多的delegate今瀑,比如最常用的UITableView程梦,

我們沒法知道Apple怎么重用UITableViewCell点把,怎么處理UITableView里Cell的增加、刪減屿附,因?yàn)槲覀儧]有源碼郎逃。

但是我們可以通過實(shí)現(xiàn)Delegate的方法來控制一個UITableView的一些行為。

UITableViewDataSource其實(shí)和delegate是一樣一樣的挺份,只是由于意義不同換了個名字罷了褒翰。

比如寫UITableView的時候,Apple這么干

UITableView.m

-(void)doSomething{

[self blahblah];

[self.delegate guruguru];

[self blahblah];

}

delegate是我們寫的類匀泊,這個類如果可以被傳給UITableView做為其delegate优训,那唯一要求,就是它實(shí)現(xiàn)了

-(void)guruguru;

這個方法各聘。

如果我們把這個方法定義在一個protocol里

@protocol XXXProtocol

-(void)guruguru;

@end

就說明了揣非,UITableView需要的delegate是一個conform to XXXProtocol的類。

這就正好是

id<XXXProtocol>

表達(dá)的意思躲因。

無論具體的類是什么妆兑,它還有其它什么方法,只要它c(diǎn)onform to這個protocol毛仪,

就說明它可以被傳給UITableView搁嗓,作為它的delegate。

那么Apple為了讓我們知道這個protocol是delegate需要conform的protocol箱靴,

它就把XXXProtocol改成了UITableViewDelegate

這樣我們看到protocol的名字里有Delegate腺逛,就知道這個protocol里的函數(shù)是用來做自定義(Customization)的了。

抄到這里衡怀,委托和協(xié)議大概我都明白了棍矛,不知道大家是否理解了,面試一般都會問的哦



來自 Haoxiang Li in iOS Development | 2011/08/26 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抛杨,一起剝皮案震驚了整個濱河市够委,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怖现,老刑警劉巖茁帽,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異屈嗤,居然都是意外死亡潘拨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門饶号,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铁追,“玉大人,你說我怎么就攤上這事茫船±攀” “怎么了扭屁?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涩禀。 經(jīng)常有香客問我料滥,道長,這世上最難降的妖魔是什么埋泵? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任幔欧,我火速辦了婚禮罪治,結(jié)果婚禮上丽声,老公的妹妹穿的比我還像新娘。我一直安慰自己觉义,他們只是感情好雁社,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晒骇,像睡著了一般霉撵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洪囤,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天徒坡,我揣著相機(jī)與錄音,去河邊找鬼瘤缩。 笑死喇完,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的剥啤。 我是一名探鬼主播锦溪,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼府怯!你這毒婦竟也來了刻诊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤牺丙,失蹤者是張志新(化名)和其女友劉穎则涯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冲簿,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡是整,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了民假。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浮入。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖羊异,靈堂內(nèi)的尸體忽然破棺而出事秀,到底是詐尸還是另有隱情彤断,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布易迹,位于F島的核電站宰衙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏睹欲。R本人自食惡果不足惜供炼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窘疮。 院中可真熱鬧袋哼,春花似錦、人聲如沸闸衫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔚出。三九已至弟翘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骄酗,已是汗流浹背稀余。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趋翻,地道東北人睛琳。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像嘿歌,于是被迫代替她去往敵國和親掸掏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

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

  • 委托(代理模式)(Delegate):顧名思義就是委托別人辦事宙帝,就是當(dāng) 一件事情發(fā)生后丧凤,自己不處理,讓別人來處理步脓。...
    Lee堅武閱讀 608評論 0 50
  • 轉(zhuǎn)帖T复! protocol和delegate完全不是一回事靴患,放在一起說仍侥,只是因?yàn)槲覀兘?jīng)常在同一個頭文件里看到這兩個...
    星空下的菜地閱讀 1,766評論 1 7
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,160評論 30 470
  • 我相信世界上所有的坎兒都能邁過去,況且我的腿還那么長鸳君。
    洋愛人閱讀 171評論 0 0
  • 在情人節(jié)和鬼鬼去看了《高跟鞋先生》农渊,看完電影才意識到,曾經(jīng)默默發(fā)誓再也不去電影院看國產(chǎn)片或颊,因?yàn)榭词坑幸徊坑|動心里...
    行壹1閱讀 343評論 0 1