每日一問23——協(xié)議Protocol

protocol(協(xié)議)是一組公開接口的集合荣恐,任何類都可以實現這一組接口春贸。

協(xié)議的聲明

@protocol testProtocol

@required
- (void)requiredMethod;

@optional
- (BOOL)optionalMethod;

@end

在objective-c中待秃,我們通過@protocol關鍵字來聲明一個協(xié)議居触,在協(xié)議中我們可以聲明需要的方法提供給遵守協(xié)議的類妖混。協(xié)議中的方法有2種類型如下:

  • @required :遵守該協(xié)議的類必須實現此關鍵字下的所有方法。
  • @optional :遵守該協(xié)議的類可以選擇實現此關鍵字下的方法轮洋,也可以都不實現制市。默認情況下協(xié)議中的方法都是這種類型的。
遵循一個協(xié)議

在聲明后面添加尖括號<協(xié)議名>來讓某個類遵循某個協(xié)議

@interface ClassA : NSObject<testProtocol>
@end

協(xié)議的特點

協(xié)議的應用

1.約束對象

在開發(fā)中弊予,我們經常會遇到這樣一種情況祥楣,我們希望使用到的實例對象必須擁有一些功能。這個時候我們可以要求這個實例對象的類必須遵守指定的協(xié)議。

//定義一個協(xié)議
@protocol isProtocol

@required
-(void)printSome;

@end

@interface ViewController ()
//需要一個遵循了isProtocol協(xié)議的對象
@property (nonatomic, strong) id<isProtocol> obj;
@end

這樣寫的好處在于增加了代碼的可讀性误褪,讓開發(fā)人員一眼就明白這個對象需要滿足什么條件责鳍。然后我們定義一個類,這個類遵循isProtocol這個協(xié)議兽间,并實現協(xié)議中的方法

@interface ClassA : NSObject<isProtocol>

@end

@implementation ClassA

- (void)printSome {
    NSLog(@"do protocol method");
}

@end

在viewController中調用

self.obj = [[ClassA alloc] init];
[self.obj printSome]
2.多重繼承

面向對象編程語言中的多重繼承指的是一個類可以同時繼承多個父類的行為和特征功能历葛。單一繼承是指:一個子類只繼承一個父類。

從上面的例子我們可以看出嘀略,遵從了協(xié)議的對象可以調用協(xié)議中提供的方法恤溶,不需要知道對象的具體類型。也就是說只要是遵從了協(xié)議的類都可以對協(xié)議中提供的方法進行不同的實現帜羊。并且一個類可以遵守多個協(xié)議宏娄!

例如,人類只能奔跑逮壁,是不能飛行和游泳的。但我們希望人類可以繼承鳥和魚的特性粮宛,讓人類也可以飛行和游泳窥淆。

//定義鳥和魚的協(xié)議
@protocol birdProtocol

@required
-(void)canFlying;

@end

@protocol fishProtocol

@required
-(void)canSwiming;

@end

//定義人的類,讓人類遵循鳥和魚這兩個協(xié)議
@interface Person : NSObject<birdProtocol, fishProtocol>
//人本身只會奔跑
- (void)canRunning;

@end

但遵循鳥和魚的協(xié)議后巍杈,人就可以實現鳥和魚協(xié)議中提供的方法忧饭,擁有飛翔和游泳的能力。

@implementation Person
- (void)canRunning {
    NSLog(@"i can running");
}

- (void)canFlying {
    NSLog(@"i can fly");
}

- (void)canSwiming {
    NSLog(@"i can swim");
}

@end
//這樣的人就可以同時擁有自己和其他協(xié)議提供的能力了筷畦。
Person *person = [[Person alloc] init];
[person canRunning];
[person canFlying];
[person canSwiming];
3.代理词裤,傳值

代理模式的定義:為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下鳖宾,一個對象不適合或者不能直接引用另一個對象吼砂,而代理對象可以在客戶端和目標對象之間起到中介的作用。

在開發(fā)中鼎文,我們可能遇到這樣一種情況渔肩,某個類的實例希望實現一個功能,但這個功能和這個實例并沒有什么關系拇惋。這個時候就需要委托一個具有相關職能的類的實例來代理實現這個工作周偎,并可以把功能中得到的結果告訴自己。

例如:一個老板想開店賺錢撑帖,但老板并不應該親自洗完蓉坎,收錢。所以老板需要請一個會洗完和收銀的員工來幫他工作胡嘿。

@protocol employeesProtocol
//洗碗
- (void)Washing;
//收銀
- (NSInteger)Cashier;
@end

首先我們需要一個協(xié)議來限制員工必須會洗完和收銀蛉艾。

@interface Employees : NSObject<employeesProtocol>

@end

@implementation Employees
-(void)Washing {
    NSLog(@"working");
}
-(NSInteger)Cashier {
    return 100;
}
@end

@interface Boss : NSObject

@property (nonatomic, strong) id<employeesProtocol> employee;
@property (nonatomic, assign) NSInteger assets;

- (void)letEmployeeWorking;
@end

@implementation Boss

- (void)letEmployeeWorking {
    [self.employee Washing];
    self.assets += [self.employee Cashier];
}

@end

定義員工類,遵循員工協(xié)議。并實現協(xié)議中提供的方法伺通。定義老板類箍土,包含一個遵循員工協(xié)議的對象和一個變量表示當前的資產拉讯。老板可以讓員工工作蹲坷,員工洗完媚创,收銀并把賺來的錢交給老板

id<employeesProtocol> employee = [[Employees alloc] init];
Boss *boss = [[Boss alloc] init];
boss.delegate = employee;
[boss letEmployeeWorking];

使用的時候明棍,我們只需要設置boss的代理戒洼,并且開始干活就可以了堪簿。于是每當boss讓員工干活就會觸發(fā)員工協(xié)議中的方法驻售〗槠溃可以參考tableview的點擊操作矢空,每當tableview點擊以后航罗,就會通知代理,我被點擊了你可以開始處理這個事件了屁药。

4.回調

回調是建立在代理之上的粥血,當我們想把事件或數據回調給某個對象,我們可以把這個對象設置為自己的代理酿箭。這樣我們就可以通過調用協(xié)議提供的方法把事件或數據傳遞給代理了复亏。

最簡單的例子:我們有A,B兩個viewcontroller缭嫡,A->B缔御,當B加載后將這個信息告訴A。

@protocol callbackProtocol <NSObject>

- (void)callBackWith:(NSString *)msg;

@end

@interface NextViewController : UIViewController

@property (nonatomic, weak) id<callbackProtocol> delegate;

@end

@implementation NextViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self.delegate callBackWith:@"viewDidLoad"];
}
@end

先定義B控制器妇蛀,B控制器提供一個回調協(xié)議耕突,并包含一個遵循這個回調協(xié)議的代理對象,當load時评架,執(zhí)行代理提供的方法眷茁。

@interface ViewController ()<callbackProtocol>
@end
//實現協(xié)議中的方法
- (void)callBackWith:(NSString *)msg {
    NSLog(@"%@",msg);
}

NextViewController *vc = [[NextViewController alloc] init];
 vc.delegate = self;
[self.navigationController pushViewController:vc animated:YES];

而界面A遵循B中的回調協(xié)議,初始化控制器B纵诞,并設置自己為B中的代理對象蔼卡。這樣當B執(zhí)行viewdidload的時候就會執(zhí)行代理,告訴A控制器自己正在viewDidLoad挣磨。即把初始化這個事件和信息回調給A控制器了雇逞。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市茁裙,隨后出現的幾起案子塘砸,更是在濱河造成了極大的恐慌,老刑警劉巖晤锥,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掉蔬,死亡現場離奇詭異廊宪,居然都是意外死亡,警方通過查閱死者的電腦和手機女轿,發(fā)現死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門箭启,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛉迹,你說我怎么就攤上這事傅寡。” “怎么了北救?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵荐操,是天一觀的道長。 經常有香客問我珍策,道長托启,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任攘宙,我火速辦了婚禮屯耸,結果婚禮上,老公的妹妹穿的比我還像新娘蹭劈。我一直安慰自己肩民,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布链方。 她就那樣靜靜地躺著,像睡著了一般灶搜。 火紅的嫁衣襯著肌膚如雪祟蚀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天割卖,我揣著相機與錄音前酿,去河邊找鬼。 笑死鹏溯,一個胖子當著我的面吹牛罢维,可吹牛的內容都是我干的。 我是一名探鬼主播丙挽,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肺孵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了颜阐?” 一聲冷哼從身側響起平窘,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凳怨,沒想到半個月后瑰艘,有當地人在樹林里發(fā)現了一具尸體是鬼,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年紫新,在試婚紗的時候發(fā)現自己被綠了均蜜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡芒率,死狀恐怖囤耳,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情敲董,我是刑警寧澤紫皇,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站腋寨,受9級特大地震影響聪铺,放射性物質發(fā)生泄漏。R本人自食惡果不足惜萄窜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一铃剔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧查刻,春花似錦键兜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至佃延,卻和暖如春现诀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背履肃。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工仔沿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尺棋。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓封锉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親膘螟。 傳聞我的和親對象是個殘疾皇子成福,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容

  • 國家電網公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數據交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,983評論 6 13
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法荆残,內部類的語法闷叉,繼承相關的語法,異常的語法脊阴,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評論 25 707
  • 滿足用戶需求 + 產品差異化 = 成功了一半 上周寫了三篇關于賦能在不同場景下的應用, 今天瀏覽新聞時發(fā)現一個故事...
    我是帥老師閱讀 290評論 0 0
  • 雞鳴寺品擎,還沒來南京的時候埋合,只記得是南京的著名景點之一。傳聞香火旺盛萄传,求姻緣很準~每逢3-4月甚颂,櫻花盛開,佳人成雙對...
    木槿麟麟閱讀 207評論 0 1