您的位置:首页 > 职场人生

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

2018-04-13 13:38 363 查看
------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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  objective c 协议