使用协议的流程:
--> 定义协议
--> 让类遵守这个协议
--> 实现协议中对应的方法(必须要实现的)
一、定义协议
什么是协议?
协议就是一些方法的声明,一般写到一个.h的头文件中.
协议的定义:(默认情况下遵守 NSObject协议)
@protocol 协议名称 <NSObject>
@end
二,遵守协议
(让某个类遵守协议,一个类可以遵守多个协议,在<>中用逗号隔开)
1) 遵守一个协议:(先导入协议的头文件)
@interface 类名 :NSObject <要遵守的协议名称>
@end
2) 遵守多个协议
@interface 类名 :NSObject <要遵守的协议名称,要遵守的协议名称,要遵守的协议名称>
@end
三,实现协议中的方法
(在类的.m文件中实现协议中的方法)
1),定义一个协议:
@protocol baseProtocol <NSObject> //声明一些方法 -(void)eat; -(void)run; @end
2),让类遵守这个协议
// 1) 导入 头文件
#import "baseProtocol.h" @interface Person : NSObject<baseProtocol> @end
3),在类的.m文件中实现协议的方法
@implementation Person -(void)eat{ NSLog(@"特别羡慕那些吃很多东西又不胖的人"); } -(void)run{ NSLog(@"人会跑");
} @end
结论: 当一个类遵守了某个协议后,就相当于这个类有了协议中所有的方法的声明
1,一个协议也可以遵守其他的协议;
@protocol workProtocol <NSObject> @end #import "workProtocol.h" @protocol baseProtocol <NSObject,workProtocol> @end
protocol的其他用法:
1),不能声明成员变量;
2),只要父类遵守了某个协议,那么子类也遵守;
3),OC中的类可以遵守多个协议;
4),基协议是NSObject;
5),协议可以遵守多个协议;
2,@required 和 @optional 都是协议中的关键字
@required 修饰的方法是必须要实现的,如果不实现,编译器会发出警告,默认
@optional 修饰的方法是可以实现,也可以不实现的
@protocol baseProtocol <NSObject> //@required 和 @optional 都是协议中的关键字 //@required 修饰的方法是必须要实现的 @required //默认情况下都是必须要实现的 -(void)run; -(void)eat; //@optional 修饰的方法是可以实现,也可以不实现的 @optional -(void)dajia; @end
3,protocol类型限制
第一种类型限制:
给id类型增加限制
id<houseHold> obj;
增加<houseHold>以后,表示,obj只能赋值遵守了houseHold协议的对象
第二种类型限制:
表示,obj2赋值的时候,必须是Girl对象,并其遵守了houseHold协议.
Girl<houseHold> *obj2;
格式:
对象<协议名称> 对象指针; (通过协议,对这个对象做一些限制)
houseHoldprotpcol.h @protocol houseHold <NSObject> @required -(void)ZuoFan; -(void)XiYiFu; @optional -(void)goodJob; @end main.m Girl *mm = [Girl new]; //增加类型限制 // 第一种类型限制:给id类型增加限制 // id<houseHold> obj; //增加<houseHold>以后,表示,obj只能赋值遵守了houseHold协议的对象 //id<houseHold> obj = d; // 第二种类型限制: //表示,obj2赋值的时候,必须是Girl对象,并其遵守 了 houseHold协议. Girl<houseHold> *obj2 = mm; // 第三种类型限制 obj2.dog = d;
4,id和instancetype的区别
1).都能作为函数的参数返回值
2).id能作为方法或者函数的返回值、参数类型,也能用来定义变量
3).instancetype 能精确限制返回值类型
5,代理模式, (传入的对象,代替当前类完成了某个功能,称为代理模式)
思路:
1)定义一个协议,里面声明代理类需要实现的方法列表, 比如这里一个代理类需要实现
findHouse方法
@protocol findHouseProtocol <NSObject> -(void)findHouse; @end
2)创建一个代理类(比如LinkHome),遵守上面的代理协议
@interface LinkHome : NSObject<findHouseProtocol> @end
3)在需要代理的类中(Student),定义一个对象类型为id且遵守代理协议的成员变量
@property(nonatomic, strong)id <findHouseProtocol>delegate;
4)在Student类中调用成员变量_delegate(代理)的方法,调用代理类的方法
[self.delegate findHouse];
5)main.m或其他使用Student类的文件中,为Student类的成员变量(代理类)赋值
LinkHome *linkHome = [LinkHome new]; stu.delegate = linkHome;
6,@protocol关键字,告诉编译器,这是一个协议.
在.m文件中使用的时候,需要导入这个协议.
@protocol delegate; 声明一个协议.
@class Person; 声明一个类。