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 @end
13 
14 @implementation
15 - (void)test
16 {
17     //要求实现该方法
18 }
19 + (void)test
20 {
21     //要求实现该方法
22 }
23 
24 - (void)test2
25 {
26     //可以不实现该方法
27 }
28 + (void)test2
29 {
30     //可以不实现该方法
31 }
32 }
33 @end
34 
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 : NSobject
10 
11 @property id<TIcketDelegate> delegate;
12 
13 - (void)buyTicket;
14 
15 @end
16 
17 
18 
19 @implementation Person
20 
21 - (void)buyTicket
22 {
23     //自己没时间去买票,叫代理
24     double price = [_delegate ticketPrice];
25     int number = [_delegate leftTicketNumber];
26     NSLog("通过代理得知,票价=%d,剩余票数为%d", price ,number);
27 }
28 @end
29 
30 
31 
32 
33 @interface Agent <TicketDelegate> //遵守协议
34 @end
35 
36 
37 
38 @implementation Agent : NSObject
39 - (double)ticketPrice
40 {
41     rerurn 100.0;
42 }
43 
44 -(int)leftTicketNumber
45 {
46     return 10;
47 }
48 @end
49 
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 }
代理(例子)

 三、自我总结

  协议顾名思义就是双方达成的意愿。但是在计算机语言中,有其特有的含义。协议本身包含大量方法的声明,协议的最大用途,我现在的理解是可以实现两个毫无关系的类的沟通,即我们常说的代理模式,协议中有大量的方法声明,只要实现这些方法就可以实现相应的功能,当然前提是要遵守。这块内容很重要,一定要牢牢掌握。

转载于:https://www.cnblogs.com/smqh/p/4246661.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值