協(xié)議和代理對于一個新手來說確實不討好理解援所,也有很多的iOS開發(fā)的老手對此是懂非懂的妻顶。網(wǎng)上的很多博文只是講了怎么使用,并沒有說的很明白滞造。下面我談一下我的理解。
1.你要先搞明白栋烤,協(xié)議和代理為什么會出現(xiàn)谒养,也就是說它存在的意義是什么,解決了什么問題。
協(xié)議和代理是模塊化開發(fā)和封裝的產(chǎn)物明郭。
先講一個小故事幫助大家理解:
老王有一家餐館买窟,剛剛開始的時候規(guī)模很小,所以老王一個人做了所有的事情:掃地薯定,做菜始绍,迎賓,上菜话侄,收銀亏推。但是后面隨著規(guī)模的擴大苛败,老王一個人就吃不消了,忙死也忙不過來了径簿。這時候怎么辦罢屈?大家都很清楚吧,招人唄篇亭!所以后面就有了服務員缠捌,收銀員,大廚译蒂,保潔員曼月。
這就意味著原先老王的工作按模塊進行了拆分。
餐館的工作流程(業(yè)務邏輯)簡單來說是這樣的:點餐->做菜->上菜->收銀->打掃衛(wèi)生柔昼。
轉(zhuǎn)換成編程世界的模型就是這樣的:業(yè)務不是很復雜的時候哑芹,我們把所有的功能都寫在一個類里面,這個類暫且叫老王捕透,理論上所有的事情和功能都可以寫到這個類里面聪姿。做菜方法,上菜方法乙嘀,打掃方法......就造成了老王這個類非常的龐大和臃腫末购,并且容易出錯。
那我們開始招人了虎谢,新建了大廚類盟榴,服務員類,收銀類婴噩,保潔類擎场,這四個類。大廚類有做菜方法几莽,服務員類點菜迅办,上菜方法,收銀類有收銀方法银觅,保潔類有打掃方法礼饱。
僅僅這樣還是不行的,因為模塊開發(fā)必然就有模塊分化以后模塊之間的通信問題究驴。大廚類只做菜 但是菜做好了怎么辦,必須及時的上菜匀伏,讓顧客享用洒忧。但是大廚自己不能上菜,所以大廚必須拋出菜做好了的信號够颠,具體這個菜上不上熙侍,怎么上,就不是大廚關(guān)心的了。
2.協(xié)議和代理所發(fā)揮的作用
老王交代大廚蛉抓,你只管做菜庆尘,菜做好了以后喊一聲菜做好了(我見過一個餐館是拉鈴鐺)。
那么老王跟大廚定的這個規(guī)矩就是協(xié)議(protocol),下面看代碼:
DaChu.h
/**
* 下面是聲明協(xié)議的固定格式巷送,DaChuDelegate是協(xié)議的名稱驶忌,因為是代理協(xié)議,名稱格式為:類名+Delegate
*/
@protocol DaChuDelegate <NSObject>
- (void)doSomethingAftercaiZuohaole;
@end
@interface DaChu : NSObject
/**
* delegate 是dachu類的一個屬性笑跛,weak 關(guān)鍵字是為了避免循環(huán)引用付魔,<DaChuDelegate>表示遵守DaChuDelegate協(xié)議
* 更加直白點:在大廚心里有一個人接受他的菜好了的信號去做一些事情,具體這個人是誰飞蹂,大廚不關(guān)心几苍,這個人的代號是delegate
*/
@property (nonatomic, weak) id <DaChuDelegate> delegate;
- (void)kaiShiZuoCai;
@end
Dachu.m
#import "DaChu.h"
@implementation DaChu
- (void)kaiShiZuoCai{
NSLog(@"開始做菜");
sleep(2);
NSLog(@"做好菜了,該上菜了");
//下面這句是判斷 一下delegate是否實現(xiàn)了doSomethingAftercaiZuohaole方法陈哑,如果delegate沒有實現(xiàn)
//直接[self.delegate doSomethingAftercaiZuohaole];會crash
if ([self.delegate respondsToSelector:@selector(doSomethingAftercaiZuohaole)]) {
[self.delegate doSomethingAftercaiZuohaole];
}
}
@end
下面看一看laowang這個類里面的內(nèi)容
#import "LaoWang.h"
#import "DaChu.h"
@interface LaoWang ()<DaChuDelegate>//<DaChuDelegate>表示遵守DaChuDelegate協(xié)議妻坝,并且實現(xiàn)協(xié)議里面的方法
@end
@implementation LaoWang
- (void)laoWangKaiYe{
NSLog(@"老王開業(yè)了");
DaChu *dachu1 = [[DaChu alloc] init];
dachu1.delegate = self;//說明老王充當代理的角色,負責接收菜好了的信號惊窖。
[dachu1 kaiShiZuoCai];//大廚開始做菜
}
- (void)doSomethingAftercaiZuohaole{
NSLog(@"老王知道了");//這里可以通知服務員去上菜了
}
@end
上面的這個過程惠勒,也可以看下圖來理解:
關(guān)于協(xié)議的理解,大家還可以參考這篇博文爬坑。
http://www.cnblogs.com/iyou/p/3636848.html
如果您喜歡這篇文章纠屋,可以通過關(guān)注或打賞支持我,您的支持十分重要盾计!