------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1. 什么是protocol
protocol定义了一些方法的声明,但是不实现,类似Java中的接口,自己只声明方法,但不实现,而由遵守了协议的类去实现方法。protocol声明方法,但是不能声明变量。
协议的作用——供其他类去遵守,如果一个类遵守了一个协议,就应该实现这个协议中必须要实现的方法。
protocol的定义格式如下:
@protocol 协议名称 <NSObject>
//方法声明列表
@end
类遵守协议,类可以遵守一个协议也可以遵守多个协议:
类遵守一个协议:
@interface 类名:父类<协议名称>
//方法声明列表
@end
类遵守多个协议:
@interface 类名:父类<协议名称1,协议名称2,... >
//方法声明列表
@end
2. protocol的使用注意事项
a. 声明方法,但是不能实现
b. 某个类遵守了一个协议,就有了协议中所有方法的声明
c. 若父类遵守了某个协议,则子类也遵守
d. protocol声明的方法可以让任何类去实现
e. OC不能继承多个类但可以遵守多个协议
f. 协议可以遵守协议,一个协议遵守了另外一个协议,就可以拥有另一个协议中方法的声明
3. protocol中的方法是否必须实现
protocol中用@required 和@optional控制方法是否必须实现,@required修饰的方法必须要实现,@optional修饰的方法可实现也可不实现,OC中默认是@required
4. protocol代理设计模式
代理设计模式是通过传入的对象代替当前类完成某个功能
代理设计模式的思路:
a. 定义一个协议,里面声明代理类需要实现的方法列表
b. 创建一个代理类,遵守上面的代理协议
c. 在需要代理的类中定义一个对象,类型为id且遵守代理协议的成员变量(delegate)
d. 在需要代理的类中调用成员变量的delegate的方法,即调用代理类的方法
e. 在mian.m或其他需要使用代理类的文件中,为需要代理类的成员变量赋值
代理模式示例代码:
#import <Foundation/Foundation.h>
//定义协议
@protocol LookBaby <NSObject>
//声明协议中的方法
-(void)feedBaby;
-(void)makeBabySleep;
@end
#import <Foundation/Foundation.h>
#import "LookBaby.h"
//代理类采纳协议
@interface Nancy : NSObject<LookBaby>
@end
//代理类实现协议中的方法
#import "Nancy.h"
@implementation Nancy
-(void)feedBaby{
NSLog(@"保姆正在喂小孩吃饭");
}
-(void)makeBabySleep{
NSLog(@"保姆正在哄小孩睡觉");
}
@end
#import <Foundation/Foundation.h>
#import "LookBaby.h"
@class Nancy;
@interface BaBy : NSObject
//为Baby定义一个代理对象,该对象遵守代理协议
@property (nonatomic,strong) id<LookBaby> delegate;
//需要代理的类的方法声明
-(void)wantEat;
-(void)wantSleep;
@end
#import "BaBy.h"
#import "Nancy.h"
@implementation BaBy
//调用代理的方法完成所要实现功能
-(void)wantEat{
[self.delegate feedBaby];
}
-(void)wantSleep{
[self.delegate makeBabySleep];
}
@end
//在main方法中实现
int main(int argc, const char * argv[]) {
@autoreleasepool {
BaBy *baby=[BaBy new];
Nancy *nancy=[Nancy new];
baby.delegate=nancy;//给需要代理的类的对象设置代理
[baby wantEat];
[baby wantSleep];
}
return 0;
}