iOS開發,
因為Object-C是不支援多繼承的,所以很多時候都是用Protocol(協議)來代替。Protocol(協議)只能定義公用的一套介面,但不能提供具體的實現方法。也就是說,它只告訴你要做什麼,但具體怎麼做,它不關心。
當一個類要使用某一個Protocol(協議)時,都必須要遵守協議。比如有些必要實現的方法,你沒有去實現,那麼編譯器就會警示告,來提醒你沒有遵守××協議。注意,我這裡說的是警告,而不是錯誤。對的,就算你不實現那些“必要實現”的方法,程式也是能啟動並執行,只不過多了些警告。
Protocol(協議)的作用:
1. 定義一套公用的介面(Public)
2. 委託代理(Delegate)傳值:
它本身是一個設計模式,它的意思是委託別人去做某事。
總結:協議是共同遵守的某種規則或規矩;代理是按照某種協議具體的實現者;
下面引用了部落格園中作者求真求道的部分文章,感覺比較清晰:https://www.cnblogs.com/iyou/p/4939823.html
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
下面看一看代理(實現者)這個類裡面的內容:
#import "LaoWang.h"#import "DaChu.h"/** <DaChuDelegate>表示遵守DaChuDelegate協議,並且實現協議裡面的方法 */@interface LaoWang ()<DaChuDelegate>@end@implementation LaoWang- (void)laoWangKaiYe{ NSLog(@"老王開業了"); DaChu *dachu1 = [[DaChu alloc] init]; dachu1.delegate = self;//說明老王充當代理的角色,負責接收菜好了的訊號。 [dachu1 kaiShiZuoCai];//大廚開始做菜}- (void)doSomethingAftercaiZuohaole{ NSLog(@"老王知道了");//這裡可以通知服務員去上菜了}@end
總結:代理類似於現實生活中的代理公司,具體的工作代理公司幫你做;協議類似於你和代理公司簽的合約。