黑马程序员_Protocol(协议)学习总结

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! 


一.协议介绍
1.协议的作用就是用来声明方法的,它的内容就是一份方法声明。

2.协议的用途:主要用在设计模式中:代理模式、观察者模式(和代理模式类似,设计思想不同)

二.定义协议
协议一般单独定义在协议名.h文件中。

1.语法格式

<span style="font-size:18px;">#import "其他协议名.h"
// 定义一个协议
@protocol 协议名称 <其他协议名称>

// 零个到多个方法声明...
// @required
// @optional
@end</span>

2.语法说明:
 1>定义协议使用@protocol关键字

 2>协议名与类名采取相同的命名规范。

 3>协议中定义的方法只有方法声明,没有方法实现,且定义在@protocol和@end之间。
 
 4>“<>”是遵守其他协议的语法,可以选择遵守一个或多个协议,也可以不遵守其他协议。建议每个新协议都遵守NSObject协议(基协议)。

 5>如果遵守其他协议,需要在文件中包含该协议的头文件。

3.关键字@required、@optional
 1>我们通过添加关键字@required、@optional来类遵守了协议后,是否必须实现协议中的方法。

 2>@required:位于该关键字之后声明的方法,遵守该协议的类必须在类实现中提供方法的实现,否则编译会发出警告。@required是默认行为。

 3>@optional:位于该关键字之后声明的方法,遵守该协议的类不要求必须提供方法的实现,否则编译会发出警告。

 4>该关键字的使用主要用于程序员之间的交流。

4.协议可用定义在单独.h文件中,也可用定义在某个类中。
 1> 如果这个协议只用在某个类中,应该把协议定义在该类中。
 
 2> 如果这个协议用在很多类中,就应该定义在单独文件中。
 
三.遵守协议

1.类遵守协议
 1>一个类如果遵守了一份协议,那么它就相当于拥有了协议中的所有方法声明。一个类可以遵守多个协议。
  1)在定义类的接口部分时可指定该类遵守的协议。
  2)只要父类遵守了某个协议,就相当于子类也遵守了。

 2>语法格式:

#import "协议名称1.h"
#import "协议名称2.h"
@interface 类名 : 父类名 <协议名称1,协议名称2>

@end

3>语法说明:
  1)文件中要包含协议的头文件。
  2)多个协议之间用逗号隔开

 4>注意
   1)一个类如果遵守了一个协议,那么在类的实现部分需要提供对应方法声明的方法实现。

2.协议遵守协议
 1>一个协议可以遵守其他多个协议,就相当于拥有了其他协议中声明的方法。在定义协议的时候可指定该协议遵守的协议。

 2>语法格式:

#import "其他协议名称1.h"
#import "其他协议名称2.h"
@protocol 协议名称 <其他协议名称1,其他协议名称2>

   // 零个到多个方法声明...

@end

 3>语法说明
   1)要包含所遵守协议的头文件。

  4>基协议
   1)NSObject协议,是最根本、最基本的协议,称为基协议。(Foundation.h)

   2)基协议中声明了很多最基本的方法,比如description、retain、release等。

   3)建议每个新的协议都遵守NSObject协议。

   4)NSObject类遵守了基协议。


四.使用协议定义变量
1.通过使用协议定义变量,要求某个对象的类型必须遵守协议,从而限制传入对象。

2.通常使用如下两种语法
 1>NSObject<协议1,协议2...> *变量;

 2>id<协议1,协议2...> *变量;
 
 3>通过这两种方式定义的变量,它们的编译时类型仅仅只是所遵守的协议类型,因此只能调用该协议中定义的方法。
 
3.定义一个变量的时候,限制这个变量保存的对象必须遵守某个协议,如果没有遵守对应的协议,编译器会警告。

程序示例:

<span style="font-size:18px;">// 要求变量obj保存的对象是NSObject类型,并且要遵守NSCopying协议
NSObject<NSCopying> *obj;

// 要求变量obj2保存的对象可以是任意OC对象类型,并且要遵守NSCoding协议
id<NSCoding> obj2;</span>


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值