1、协议:1> 是一系列方法的列表,其声明的方法可以被任何类实现。
2> 协议不是类,它是定义了一个其他对象可以实现的接口。
3> 如果这个类实现了协议中的某个方法,也就是这个类实现了那个协议。
4> 委托:就是调用自己定义方法,别的类来实现。
2、基本用途:1> 可以用来声明一大堆方法(不能声明成员变量),不能写实现。
2> 只要某个类中遵守了这个协议,就相当于拥有了这个协议中所有的方法声明。
3> 只要父类遵守了某个协议,就相当于子类也遵守了。
3、基本语法
1>协议的编写格式:
1、协议:1> 是一系列方法的列表,其声明的方法可以被任何类实现。
2> 协议不是类,它是定义了一个其他对象可以实现的接口。
3> 如果这个类实现了协议中的某个方法,也就是这个类实现了那个协议。
4> 委托:就是调用自己定义方法,别的类来实现。
2、基本用途:1> 可以用来声明一大堆方法(不能声明成员变量),不能写实现。
2、基本用途:1> 可以用来声明一大堆方法(不能声明成员变量),不能写实现。
2> 只要某个类中遵守了这个协议,就相当于拥有了这个协议中所有的方法声明。
3> 只要父类遵守了某个协议,就相当于子类也遵守了。
3、基本语法
1>协议的编写格式:
@protocal 协议名称
方法声明列表;
@end
eg:
<span style="font-family:Microsoft YaHei;font-size:14px;">@protocal myorotocal <NSObject>//NSObject是基协议,每个协议必须遵守基协议。
//方法的声明
-(void)test1;
-(void)test2;
@end</span>
2> 协议关键词
协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流。
@required:要求方法必须实现,不实现就会发出警告(默认)
@optional:不要求一定实现。
3> 如何遵守协议
1)类遵守协议
@interface 类名:父类名<协议名称1,协议名称2>
@end
2)协议遵守协议:一个协议可以遵守其他多个协议,多个协议之间用逗号 , 隔开:
@protocal 协议名<协议名称1,协议名称2>
注意:如果一个协议遵守了另外一个协议,就可以拥有另一个协议的所有方法声明。
eg:创建一个协议:
<span style="font-family:Microsoft YaHei;font-size:14px;font-weight: normal;">#import <Foundation/foundation.h>
//MyProtocal协议,这个协议遵守基协议<NSObject>
@protocal MyProtocal <NSObject>
//在协议中声明很多有用的方法;
//@property int age;在协议中不能声明成员变量,只能声明方法,也不能实现方法。
@required
//@required关键字,主要用于程序员之间的交流,要求实现
-(void)ptint;
-(void)haha;
@end</span>
遵守协议:
<span style="font-family:Microsoft YaHei;font-size:14px;font-weight: normal;">#import <Foundation/Foundation.h>
#import<MyProtocal.h>
//在类的声明中加入协议的头文件
//Person类的声明,这个类继承了NSObject类,遵守MyProtocal协议
@interface Person:NSObject<MyProtocal>
@end</span>
完成协议中声明方法的实现:
<span style="font-family:Microsoft YaHei;font-size:14px;font-weight: normal;">#import"Person.h"
@implementation Person
//在这里进行遵守的协议中声明方法的实现
-(viod)print
{
NSLog(@"____________");
}
-(void)haha
{
NSLog(@"哈哈");
}
@end</span>
4、基协议
1>NSObject是一个基类,最基本的类,任何其它类型最终都要继承NSObject;
2>NSObject也是一个基协议,一般写协议的时候最后都要加上<NSObject>。
5、 定义变量时指定协议
1>@property (nonatomic,strong)类名 <协议名称> *变量名
eg:NSObject<NSCopying>*obj;// NSObject类型的对象,并且obj要遵守NSCopying协议。
2>@property(nonatomic,strong) id<协议名称>变量名
eg:id<NSCoding> obj2;//任何OC类型的对象,并且要遵守NSCoding协议。
<span style="font-family:Microsoft YaHei;font-size:14px;font-weight: normal;">@property(nonamic ,strong )Car <myprotocal> *c;//c属性遵守了myprotocal协议</span>
@property (nonatomic,strong) id<协议名称> 属性名
在.h文件中,如果某个对象遵循某个协议,那么只需要在.h文件开头 @protocal 协议名,类似于@class的用法,等到在.m文件中正在用到的时候再 #import“协议名”,例如:
在person.h文件中:
<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-weight: normal;">#import <Foundation/Foundation.h>
@class hashiqi;
@protical MyProtocal;
@interface Person :NSObject <MyProtocal>
@property (nonatomic ,strong) hashiqi <Protocol> *dog;
@end</span>
</span>
6、协议本身写在.h文件中,但也可以定义在任何地方,当这个协议只有这个类使用遵守时,一般把协议写在这个类里面,当这个协议需要多些类去实现时,就写在外边单独的文件中。
<span style="font-family:Microsoft YaHei;font-size:14px;">@protocal myorotocal <NSObject>//NSObject是基协议,每个协议必须遵守基协议。
//方法的声明
-(void)test1;
-(void)test2;
@end</span>
2> 协议关键词协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流。
@required:要求方法必须实现,不实现就会发出警告(默认)
@optional:不要求一定实现。
<span style="font-family:Microsoft YaHei;font-size:14px;font-weight: normal;">#import <Foundation/foundation.h>
//MyProtocal协议,这个协议遵守基协议<NSObject>
@protocal MyProtocal <NSObject>
//在协议中声明很多有用的方法;
//@property int age;在协议中不能声明成员变量,只能声明方法,也不能实现方法。
@required
//@required关键字,主要用于程序员之间的交流,要求实现
-(void)ptint;
-(void)haha;
@end</span>
遵守协议:
<span style="font-family:Microsoft YaHei;font-size:14px;font-weight: normal;">#import <Foundation/Foundation.h>
#import<MyProtocal.h>
//在类的声明中加入协议的头文件
//Person类的声明,这个类继承了NSObject类,遵守MyProtocal协议
@interface Person:NSObject<MyProtocal>
@end</span>
完成协议中声明方法的实现:
<span style="font-family:Microsoft YaHei;font-size:14px;font-weight: normal;">#import"Person.h"
@implementation Person
//在这里进行遵守的协议中声明方法的实现
-(viod)print
{
NSLog(@"____________");
}
-(void)haha
{
NSLog(@"哈哈");
}
@end</span>
2>@property(nonatomic,strong) id<协议名称>变量名
<span style="font-family:Microsoft YaHei;font-size:14px;font-weight: normal;">@property(nonamic ,strong )Car <myprotocal> *c;//c属性遵守了myprotocal协议</span>
@property (nonatomic,strong) id<协议名称> 属性名
在.h文件中,如果某个对象遵循某个协议,那么只需要在.h文件开头 @protocal 协议名,类似于@class的用法,等到在.m文件中正在用到的时候再 #import“协议名”,例如:
在person.h文件中:
<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-weight: normal;">#import <Foundation/Foundation.h>
@class hashiqi;
@protical MyProtocal;
@interface Person :NSObject <MyProtocal>
@property (nonatomic ,strong) hashiqi <Protocol> *dog;
@end</span>
</span>
6、协议本身写在.h文件中,但也可以定义在任何地方,当这个协议只有这个类使用遵守时,一般把协议写在这个类里面,当这个协议需要多些类去实现时,就写在外边单独的文件中。