首页 > 代码库 > oc语言--protocol(协议)
oc语言--protocol(协议)
一、protocol
1.基本用途
1> 可以用来声明很多方法,但是不能用来声明成员变量
2> 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
3> 只要父类遵守了某个协议,就相当于子类也遵守了
2.格式
1> 协议的编写
@protocol 协议名称
//方法声明列表
- (void)test;
- (void)test2;
+ (void)test;
+ (void)test2;
@end
2> 某个类遵守协议
@interface 类名 :父类 <协议名称>
@end
3> 定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名> 变量名;
例如:NSObject<协议名1> *obj;//现在obj只能保存遵守协议名1的对象;如果没有遵守编译器会发出严重警告
4> @property中声明的属性也可用作一个遵守协议的限制
例如:@property (nonatomic,strong) 类名<协议名称> *属性名;
@property (nonatomic,strong) Dog<协议名> *dog;
3.关键字
协议中有两个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流
1> @required:这个方法必须要实现(若不实现,编译器会发出警告)
2> @optional:这个方法不一定要实现
1 @protocol MyProtocol //声明协议 2 - (void)test; 3 + (void)test; 4 @optional 5 - (void)test2; 6 + (void)test2; 7 @end 8 9 #import <Foundation.Foundation.h>10 11 @interface Person : NSObject <MyProtocol> //遵守协议12 @end13 14 @implementation15 - (void)test16 {17 //要求实现该方法18 }19 + (void)test20 {21 //要求实现该方法22 }23 24 - (void)test225 {26 //可以不实现该方法27 }28 + (void)test229 {30 //可以不实现该方法31 }32 }33 @end34 35 int main()36 {37 return 0;38 }
4.协议遵守协议
1> 一个协议可以遵守其他多个协议,多个协议之间用逗号,隔开
2> 一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明
3> 多协议格式
@protocol 协议名称 <协议1,协议2>
@end
5.基协议
1> NSObject是一个基类,最根本最基本的类,任何其它类最终都要继承他
2> NSObject也是一个协议,最根本最基本的协议
3> NSObject协议中声明了很多最基本的方法,例如description、retain、release等
4> 建议每个新协议都要遵守NSObject协议
6.注意点
协议可以定义在单独.h文件中,也可以定义在某个类中
1> 如果这个协议只用在某个类中,应该把协议定义在该类中
2> 如果这个协议用在很多类中,就应该定义在单独文件中
二、协议的应用--代理模式
1.设计原理
有些事情不想自己亲自做,就可以找个人帮忙做,即交给代理对象去做
2.设计原则
1> 首先要拥有某个代理对象属性
2> 其次要清楚代理有哪些方法
3> 最后要帮助能解耦
3.实现方案
1> 定义一个protocol,在其中声明一些和代理沟通的方法
2> 拥有一个代理属性 id<protocol>delegate
3> 让代理遵守protocol
1 #import <Foundation.Foundation.h> 2 3 @property TicketDelegate <NSObjecct> // 设计协议 4 - (double)ticketPrice; // 票价 5 -(int)leftTicketNumber; // 剩余票数 6 @end 7 8 9 @interface Person : NSobject10 11 @property id<TIcketDelegate> delegate;12 13 - (void)buyTicket;14 15 @end16 17 18 19 @implementation Person20 21 - (void)buyTicket22 {23 //自己没时间去买票,叫代理24 double price = [_delegate ticketPrice];25 int number = [_delegate leftTicketNumber];26 NSLog("通过代理得知,票价=%d,剩余票数为%d", price ,number);27 }28 @end29 30 31 32 33 @interface Agent <TicketDelegate> //遵守协议34 @end35 36 37 38 @implementation Agent : NSObject39 - (double)ticketPrice40 {41 rerurn 100.0;42 }43 44 -(int)leftTicketNumber45 {46 return 10;47 }48 @end49 50 51 52 int main()53 {54 Person *p = [Person new]; //人55 Agent *a = [Agent new]; // 代理56 57 p.delegate = a; // 设置人的代理58 [p buyTicket];59 60 return 0;61 }
oc语言--protocol(协议)