iOS學(xué)習(xí)(OC語言)知識點(diǎn)整理
一、關(guān)于協(xié)議(PRotocol)的介紹
1)概念:協(xié)議指多個對象之間協(xié)商的一個接口對象,協(xié)議提供了一些方法用在協(xié)議的實現(xiàn)者和代理者
之間通訊的一種方式
2)聲明一個協(xié)議@protocol協(xié)議的名字<基協(xié)議> 一個協(xié)議可以遵守另一個協(xié)議:
基協(xié)議(這個協(xié)議就擁有了基協(xié)議中所有方法的聲明)
3)協(xié)議中不能聲明成員變量,只能有方法聲明。
4)協(xié)議中聲明方法,默認(rèn)是required 表明方法是必須要實現(xiàn)的,否則會有系統(tǒng)警告,但不會報錯
5)協(xié)議中@optional表明方法是可選的(可以實現(xiàn)也可以不實現(xiàn))
6)使用協(xié)議:某個類遵守協(xié)議,類名后面<協(xié)議名> ;所謂遵守協(xié)議就是:類擁有了協(xié)議中所有方法的聲明,
必須實現(xiàn)協(xié)議中規(guī)定的方法;一個類可以遵守多個協(xié)議(類擁有所有協(xié)議中聲明的方法,必須實現(xiàn)所有
協(xié)議中規(guī)定的方法)
7)一個協(xié)議可以遵守另一個協(xié)議,遵守協(xié)議后就擁有了另一個協(xié)議所有方法的聲明,同時還可以添加自己的方法
8)一個協(xié)議可以遵守多個協(xié)議,并擁有所有基協(xié)議的方法
9)協(xié)議的聲明與使用方法 實例代碼:
1、添加一個基于Protocol命名為MyProtocol的.h 文件 聲明一些協(xié)議方法 例如:
1 #import <Foundation/Foundation.h> 2 @protocol MyProtocol <NSObject> 3 //協(xié)議中不能聲明成員變量,只有方法 4 //{ 5 // int _a; 6 //} 7 //協(xié)議中聲明方法,默認(rèn)是required 8 -(void)test1; 9 -(void)test2;10 //@required表明方法是必須要實現(xiàn)的11 @required12 -(void)test3;13 //@optional表明方法是可選的(可以實現(xiàn)也可以不實現(xiàn))14 @optional15 -(void)test4;16 @end
2、定義一個Person類 在.h文件中使用協(xié)議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文件中實現(xiàn)協(xié)議方法 例如:
1 #import "Person.h" 2 @implementation Person 3 -(void)print 4 { 5 NSLog(@"person:%@",self.name); 6 } 7 //實現(xiàn)協(xié)議中規(guī)定的方法 8 -(void)test1 9 {10 NSLog(@"test1");11 }12 -(void)test213 {14 15 }16 -(void)test317 {18 19 }20 21 @end
4、在main文件中執(zhí)行方法 例如:
1 Person *p1=[[Person alloc]init]; 2 //判斷p1所屬的類是否遵守了協(xié)議 3 if([p1 conformsToProtocol:@protocol(MyProtocol)]){ 4 //判斷p1所屬的類是否實現(xiàn)了方法 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協(xié)議17 id<MyProtocol> obj4=[[Person alloc]init];18 Person<MyProtocol> *obj5=[[Person alloc]init];
10)OC中沒有多繼承,但可以通過協(xié)議實現(xiàn),可通過使用多個協(xié)議來實現(xiàn)類似多繼承的方法。
11)協(xié)議主要用來統(tǒng)一規(guī)范接口;統(tǒng)一接口的方法:繼承和協(xié)議
12)協(xié)議與繼承的區(qū)別
1、繼承也可以統(tǒng)一規(guī)范接口:子類繼承父類所有的方法(可以不用重寫,除非父類的方法不適合子類),
重寫后的方法名與父類一樣,達(dá)到了統(tǒng)一接口的目的;子類中可以增加成員變量
2、協(xié)議:一個類遵守協(xié)議,類就具有協(xié)議中所有的方法,如果多個類都遵守同一個協(xié)議,這些類都有協(xié)議
中規(guī)范的方法,達(dá)到了統(tǒng)一接口的目的;協(xié)議中不能有成員變量
新聞熱點(diǎn)
疑難解答