因為Object-C是不支持多繼承的,所以很多時候都是用Protocol(協議)來代替。Protocol(協議)只能定義公用的一套介面,但不能提供具體的實現方法。也就是說,它只告訴你要做什麼,但具體怎麼做,它不關心。 當一個類要使用某一個Protocol(協議)時,都必須要遵守協議。比如有些必要實現 ...
因為Object-C是不支持多繼承的,所以很多時候都是用Protocol(協議)來代替。Protocol(協議)只能定義公用的一套介面,但不能提供具體的實現方法。也就是說,它只告訴你要做什麼,但具體怎麼做,它不關心。
當一個類要使用某一個Protocol(協議)時,都必須要遵守協議。比如有些必要實現的方法,你沒有去實現,那麼編譯器就會報警告,來提醒你沒有遵守××協議。註意,我這裡說的是警告,而不是錯誤。對的,就算你不實現那些“必要實現”的方法,程式也是能運行的,只不過多了些警告。
Protocol(協議)的作用:
1. 定義一套公用的介面(Public)
-
@required:必須實現的方法
-
@optional:可選 實現的方法(可以全部都不實現)
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
總結:代理類似於現實生活中的代理公司,具體的工作代理公司幫你做;協議類似於你和代理公司簽的合同。