IOS階段學習第19天筆記(協議-Protocol),ios-protocol
IOS學習(OC語言)知識點整理
一、關於協議(Protocol)的介紹
1)概念:協議指多個對象之間協商的一個介面對象,協議提供了一些方法用在協議的實現者和代理者
之間通訊的一種方式
2)聲明一個協議@protocol協議的名字<基協議> 一個協議可以遵守另一個協議:
基協議(這個協議就擁有了基協議中所有方法的聲明)
3)協議中不能聲明成員變數,只能有方法聲明。
4)協議中聲明方法,預設是required 表明方法是必須要實現的,否則會有系統警告,但不會報錯
5)協議中@optional表明方法是可選的(可以實現也可以不實現)
6)使用協議:某個類遵守協議,類名後面<協議名> ;所謂遵守協議就是:類擁有了協議中所有方法的聲明,
必須實現協議中規定的方法;一個類可以遵守多個協議(類擁有所有協議中聲明的方法,必須實現所有
協議中規定的方法)
7)一個協議可以遵守另一個協議,遵守協議後就擁有了另一個協議所有方法的聲明,同時還可以添加自己的方法
8)一個協議可以遵守多個協議,並擁有所有基協議的方法
9)協議的聲明與使用方法 執行個體代碼:
1、添加一個基於Protocol命名為MyProtocol的.h 檔案 聲明一些協議方法 例如:
1 #import <Foundation/Foundation.h> 2 @protocol MyProtocol <NSObject> 3 //協議中不能聲明成員變數,只有方法 4 //{ 5 // int _a; 6 //} 7 //協議中聲明方法,預設是required 8 -(void)test1; 9 -(void)test2;10 //@required表明方法是必須要實現的11 @required12 -(void)test3;13 //@optional表明方法是可選的(可以實現也可以不實現)14 @optional15 -(void)test4;16 @end
2、定義一個Person類 在.h檔案中使用協議MyProtocol 例如:
1 #import <Foundation/Foundation.h>2 #import "MyProtocol.h" 3 @interface Person : NSObject<MyProtocol>4 @property(nonatomic,copy)NSString *name;5 -(void)print;6 @end
3、在Person類的.m檔案中實現協議方法 例如:
1 #import "Person.h" 2 @implementation Person 3 -(void)print 4 { 5 NSLog(@"person:%@",self.name); 6 } 7 //實現協議中規定的方法 8 -(void)test1 9 {10 NSLog(@"test1");11 }12 -(void)test213 {14 15 }16 -(void)test317 {18 19 }20 21 @end
4、在main檔案中執行方法 例如:
1 Person *p1=[[Person alloc]init]; 2 //判斷p1所屬的類是否遵守了協議 3 if([p1 conformsToProtocol:@protocol(MyProtocol)]){ 4 //判斷p1所屬的類是否實現了方法 5 if([p1 respondsToSelector:@selector(test1)]){ 6 [p1 test1]; 7 } 8 } 9 10 NSObject *obj1=[[NSObject alloc]init];11 obj1=nil;12 NSObject *obj2=@"hello";13 obj2=nil;14 //對obj3指向的對象做一個限制15 NSObject<MyProtocol> *obj3=@"abc";16 //obj4可以指向任意類型的對象,但是必須遵守MyProtocol協議17 id<MyProtocol> obj4=[[Person alloc]init];18 Person<MyProtocol> *obj5=[[Person alloc]init];
10)OC中沒有多繼承,但可以通過協議實現,可通過使用多個協議來實作類別似多繼承的方法。
11)協議主要用來統一規範介面;統一介面的方法:繼承和協議
11)協議與繼承的區別
1、繼承也可以統一規範介面:子類繼承父類所有的方法(可以不用重寫,除非父類的方法不適合子類),
重寫後的方法名與父類一樣,達到了統一介面的目的;子類中可以增加成員變數
2、協議:一個類遵守協議,類就具有協議中所有的方法,如果多個類都遵守同一個協議,這些類都有協議
中規範的方法,達到了統一介面的目的;協議中不能有成員變數