協議和代理對於一個新手來說確實不討好理解,也有很多的iOS開發的老手對此是懂非懂的。網上的很多博文只是講了怎么使用,並沒有說的很明白。下面我談一下我的理解。
1.你要先搞明白,協議和代理為什么會出現,也就是說它存在的意義是什么,解決了什么問題。
協議和代理是模塊化開發和封裝的產物。
先講一個小故事幫助大家理解:
老王有一家餐館,剛剛開始的時候規模很小,所以老王一個人做了所有的事情:掃地,做菜,迎賓,上菜,收銀。但是后面隨着規模的擴大,老王一個人就吃不消了,忙死也忙不過來了。這時候怎么辦?大家都很清楚吧,招人唄!所以后面就有了服務員,收銀員,大廚,保潔員。
這就意味着原先老王的工作按模塊進行了拆分。

餐館的工作流程(業務邏輯)簡單來說是這樣的:點餐->做菜->上菜->收銀->打掃衛生。
轉換成編程世界的模型就是這樣的:業務不是很復雜的時候,我們把所有的功能都寫在一個類里面,這個類暫且叫老王,理論上所有的事情和功能都可以寫到這個類里面。做菜方法,上菜方法,打掃方法......就造成了老王這個類非常的龐大和臃腫,並且容易出錯。
那我們開始招人了,新建了大廚類,服務員類,收銀類,保潔類,這四個類。大廚類有做菜方法,服務員類點菜,上菜方法,收銀類有收銀方法,保潔類有打掃方法。
僅僅這樣還是不行的,因為模塊開發必然就有模塊分化以后模塊之間的通信問題。大廚類只做菜 但是菜做好了怎么辦,必須及時的上菜,讓顧客享用。但是大廚自己不能上菜,所以大廚必須拋出菜做好了的信號,具體這個菜上不上,怎么上,就不是大廚關心的了。
2.協議和代理所發揮的作用
老王交代大廚,你只管做菜,菜做好了以后喊一聲菜做好了(我見過一個餐館是拉鈴鐺)。
那么老王跟大廚定的這個規矩就是協議(protocol),下面看代碼:
DaChu.h
/**
* 下面是聲明協議的固定格式,DaChuDelegate是協議的名稱,因為是代理協議,名稱格式為:類名+Delegate
*/
@protocol DaChuDelegate <NSObject>
- (void)doSomethingAftercaiZuohaole;
@end
@interface DaChu : NSObject
/**
* delegate 是dachu類的一個屬性,weak 關鍵字是為了避免循環引用,<DaChuDelegate>表示遵守DaChuDelegate協議
* 更加直白點:在大廚心里有一個人接受他的菜好了的信號去做一些事情,具體這個人是誰,大廚不關心,這個人的代號是delegate
*/
@property (nonatomic, weak) id <DaChuDelegate> delegate;
- (void)kaiShiZuoCai;
@end
Dachu.m
#import "DaChu.h"
@implementation DaChu
- (void)kaiShiZuoCai{
NSLog(@"開始做菜");
sleep(2);
NSLog(@"做好菜了,該上菜了");
//下面這句是判斷 一下delegate是否實現了doSomethingAftercaiZuohaole方法,如果delegate沒有實現
//直接[self.delegate doSomethingAftercaiZuohaole];會crash
if ([self.delegate respondsToSelector:@selector(doSomethingAftercaiZuohaole)]) {
[self.delegate doSomethingAftercaiZuohaole];
}
}
@end
下面看一看laowang這個類里面的內容
#import "LaoWang.h"
#import "DaChu.h"
@interface LaoWang ()<DaChuDelegate>//<DaChuDelegate>表示遵守DaChuDelegate協議,並且實現協議里面的方法
@end
@implementation LaoWang
- (void)laoWangKaiYe{
NSLog(@"老王開業了");
DaChu *dachu1 = [[DaChu alloc] init];
dachu1.delegate = self;//說明老王充當代理的角色,負責接收菜好了的信號。
[dachu1 kaiShiZuoCai];//大廚開始做菜
}
- (void)doSomethingAftercaiZuohaole{
NSLog(@"老王知道了");//這里可以通知服務員去上菜了
}
@end
上面的這個過程,也可以看下圖來理解:

關於協議的理解,大家還可以參考這篇博文。
http://www.cnblogs.com/iyou/p/3636848.html
如果你喜歡這篇文章,請關注我,您的支持十分重要!
