關(guān)于Objective-C的delegate極簡講解

  • “太長不看!”污筷,我們盡量壓縮工闺,只講重點(diǎn)和基礎(chǔ)。

概念

大白話:我寫了一些粗糙的框架功能瓣蛀,給了你一個使用的接口陆蟆,由你來完成具體的細(xì)節(jié),而你就是我的delegate惋增,我委托你來做叠殷。

舉例

不上代碼的作者不是好程序員
下面附上代碼,大家如果有興致的話可以跟著一步一步做诈皿。
1.為方便起見林束,直接Xcode創(chuàng)建OS X Application下的Command Line Tool工程。

MAC的Application下的Command Line Tool工程

2.代碼非常簡單稽亏,分為A和B兩個類壶冒,A類提供粗糙接口,B完成具體功能截歉,實(shí)現(xiàn)A的委托胖腾,之后在main函數(shù)中使用它們。

工程結(jié)構(gòu)

3.A類:

  • A.h
#import <Foundation/Foundation.h>

@protocol ADelegate <NSObject>

- (void)weDidGetSthFromA:(NSString *)sthFromA;

@end

@interface A : NSObject

@property (weak, nonatomic) id<ADelegate> delegate;
- (void)doSth;

@end

A.h在普通的頭文件的基礎(chǔ)上瘪松,增添了@protocol關(guān)鍵字咸作,以聲明一個ADelegate協(xié)議,協(xié)議顧名思義宵睦,如果某個類使用了該協(xié)議记罚,可以根據(jù)協(xié)議的要求,使用及實(shí)現(xiàn)協(xié)議的一些接口壳嚎。之后B就會使用ADelegate這個協(xié)議桐智。 協(xié)議實(shí)現(xiàn)了一個名為 weDidGetSthFromA:的方法。
注:在查看一些源碼時诬辈,有時會在方法明前看到@required或者@optional關(guān)鍵字酵使,它們表明委托在使用協(xié)議時,是否必須實(shí)現(xiàn)協(xié)議中的方法焙糟,@required是必須口渔,@optional是可選。
同時很重要的一點(diǎn)穿撮,在@interface A中缺脉,由于要為A指派委托痪欲,因此需要聲明一個@property,代碼中的@property表明它屬于ADelegate協(xié)議攻礼,名字叫delegate业踢。
最后,A類定義了一個演示用的方法doSth礁扮,它在這里不是重點(diǎn)知举。

  • A.m
#import "A.h"

@implementation A
- (id)init
{
    if (self = [super init])
    {
        //do sth
    }
    return self;
}

- (void)doSth
{
    [self.delegate weDidGetSthFromA:@"B, 做點(diǎn)什么吧!"];
}
@end

A.m文件中普通的init,關(guān)鍵處請注意- (void)doSth函數(shù)太伊,乍一看它很普通雇锡,就一行代碼,但恰恰是這一行代碼僚焦,包含了delegate的精髓锰提。
還記得delegate的含義嗎?在這里A委托B做事情芳悲,A只提供必要的接口立肘,B是A的delegate,因此在A中名扛,A覺得“嗯谅年!之后總會有誰會幫我完成更加具體的功能的,我在這里提供接口就行了”罢洲,于是A就在- (void)doSth函數(shù)中踢故,默默讓它的代理:self.delegate文黎,執(zhí)行了相應(yīng)的接口函數(shù)weDidGetSthFromA(即協(xié)議里面那個方法)惹苗。
之后,A只要執(zhí)行doSth方法耸峭,A的delegate(此示例只能一對一桩蓉,即一個代理),即后文的B就能獲取weDidGetSthFromA這個方法包含的信息劳闹,我們稱之為回調(diào)院究。
4.B類:

  • B.h
#import <Foundation/Foundation.h>
#import "A.h"

@interface B : NSObject <ADelegate>

@end

B.h @interface B : NSObject <ADelegate>關(guān)鍵的一行,表明B遵循ADelegate協(xié)議本涕。

  • B.m
#import "B.h"

@implementation B 
- (id)init
{
    if (self = [super init])
    {
        //do sth
    }
    return self;
}

- (void)weDidGetSthFromA:(NSString *)sthFromA
{
    NSLog(@"A告訴B: %@", sthFromA);
}
@end

B.m也是普通的init业汰,關(guān)鍵點(diǎn)就是因?yàn)樵陬^文件中遵循ADelegate協(xié)議,因此它可以使用weDidGetSthFromA方法菩颖。在A.m中样漆,A覺得它的代理會如上述那么做,因此A給B傳了一個NSString@"B, 做點(diǎn)什么吧!"晦闰,在這里B可以獲取這個回調(diào)放祟,并在這里NSLog打印了出來鳍怨。

5.main函數(shù)

#import <Foundation/Foundation.h>
#import "A.h"
#import "B.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
       
        A *a = [[A alloc] init];
        B *b = [[B alloc] init];
        
        a.delegate = b;
        [a doSth];
    }
    return 0;
}

OK,終于到了main 函數(shù)跪妥,A和B普通地實(shí)例化鞋喇,關(guān)鍵的一行則是:a.delegate = b;如上述,一切都做好了眉撵,就差一步侦香,那就是究竟誰做a的代理呢,那么這一行代碼就說明了一切纽疟,b是a的代理鄙皇,b來具體使用weDidGetSthFromA方法。
下面一行仰挣,[a doSth];執(zhí)行這個方法后伴逸,a就向b傳遞了@"B, 做點(diǎn)什么吧!"這個NSString,然后b就打印出來膘壶。
大家可以運(yùn)行一下代碼错蝴,看看輸出的情況。

總結(jié)

初次使用delegate颓芭,可能會有點(diǎn)摸不著頭腦顷锰,不知道“回調(diào)”是什么,其實(shí)它們就是提供接口與使用接口的關(guān)系亡问。
希望這篇文章能給大家?guī)硪稽c(diǎn)點(diǎn)幫助官紫。感謝閱讀!
如轉(zhuǎn)發(fā)州藕,請注明出處束世。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市床玻,隨后出現(xiàn)的幾起案子毁涉,更是在濱河造成了極大的恐慌,老刑警劉巖锈死,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贫堰,死亡現(xiàn)場離奇詭異,居然都是意外死亡待牵,警方通過查閱死者的電腦和手機(jī)其屏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缨该,“玉大人偎行,你說我怎么就攤上這事。” “怎么了睦优?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵渗常,是天一觀的道長。 經(jīng)常有香客問我汗盘,道長皱碘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任隐孽,我火速辦了婚禮癌椿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菱阵。我一直安慰自己踢俄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布晴及。 她就那樣靜靜地躺著都办,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虑稼。 梳的紋絲不亂的頭發(fā)上琳钉,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天,我揣著相機(jī)與錄音蛛倦,去河邊找鬼歌懒。 笑死,一個胖子當(dāng)著我的面吹牛溯壶,可吹牛的內(nèi)容都是我干的及皂。 我是一名探鬼主播,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼且改,長吁一口氣:“原來是場噩夢啊……” “哼验烧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钾虐,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤噪窘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后效扫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡直砂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年菌仁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片静暂。...
    茶點(diǎn)故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡济丘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情摹迷,我是刑警寧澤疟赊,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站峡碉,受9級特大地震影響近哟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鲫寄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一吉执、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧地来,春花似錦戳玫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜡秽,卻和暖如春荠列,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背载城。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工肌似, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诉瓦。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓川队,卻偏偏與公主長得像,于是被迫代替她去往敵國和親睬澡。 傳聞我的和親對象是個殘疾皇子固额,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評論 2 350

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

  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,135評論 30 470
  • 禪與 Objective-C 編程藝術(shù) (Zen and the Art of the Objective-C C...
    GrayLand閱讀 1,607評論 1 10
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,837評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)煞聪,斷路器斗躏,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法昔脯,內(nèi)部類的語法啄糙,繼承相關(guān)的語法,異常的語法云稚,線程的語...
    子非魚_t_閱讀 31,599評論 18 399