------ Java培训、Android培训、iOS培训、.Net培训期待与您交流! ------
http://www.itheima.com
- protocol(协议):可以声明一些必须实现的方法和选择实现的方法,一般写到一个.h的头文件中。
- 协议的作用:供其他的类去遵守,如果一个类遵守了一个协议,就应该实现这个协议中定义的必须要实现的方法。
- 协议使用流程:协议的定义、遵守协议、实现协议。
- 协议的定义格式:
@protocol 协议名称 <NSObject> 注意:默认遵守NSObject协议
//方法声明列表
@end;
- 遵守协议的格式:
@interface 类名 : 父类 <协议名称>
@end
多个协议之间用逗号 , 隔开:
@interface 类名 : 父类 <协议名称1,协议名称2>
@end
某个协议遵守某个或者某几个协议:
@protocol 协议名称<其他协议名称>
@end
多个协议之间用逗号 , 隔开:
@protocol 协议名称 <其他协议名称1, 其他协议名称2>
@end
- 实现协议:如果一个类遵守了某个协议则只需要在这个类的实现(.m)文件中,实现协议的方法就可以了。
- protocol使用注意:用来声明方法(不能声明成员变量),不能写实现;只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明;只要父类遵守了某个协议,那么子类也遵守;protocol声明的方法可以让任何类去实现,protocol就是协议;OC不能继承多个类(单继承)但是能够遵守多个协议;<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法;协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明。
- @required关键字:修饰的方法是必须要实现的。默认情况下是必须要实现的。
- @optional关键字:修饰的方法是可以实现,也可以不实现。
@protocol baseProtocol <NSObject>
//@required 修饰的方法是必须要实现的
@required
-(void)run;
//@optional 修饰的方法是可以实现,也可以不实现的
@optional
-(void)playgame;
@end
- protocol类型限制:
1.id类型对象的限制:格式:id <协议名称> 变量名,例如:id<houseHold> obj;表示obj只能赋值遵守了houseHold协议的对象。
2.指定特定类的对象赋值的类型限制:格式:类名<协议名称> *变量名,例如:Girl<houseHold> *obj = girl;表示obj赋值的时候,必须是Girl类的对象,并其遵守了houseHold协议。
3.对象关联关系下,对象的类型限制:例如:女孩需要一条会算术的狗,在Girl的文件声明中使用@property (nonatomic,strong) Dog<caculatorProtocol> *dog;
Dog *d = [Dognew];
Girl *girl = [Girlnew];
girl.dog = d;//如果Dog.h文件中没有遵守caculatorProtocol协议,此条语句处编译器会发出警告。
- protocol代理设计模式:某个对象指定另一个对象处理某些特定任务的设计模式。下面以保姆喂婴儿吃东西的例子加以说明:
@protocol lookBabyProtocol
//喂婴儿吃东西
-(void)feedBaby;
@end
#import
//保姆想成为婴儿的代理人,就必须遵守lookBabyProtocol协议
#import "lookBabyProtocol.h"
@interface BaoMu : NSObject
@end
@implementation BaoMu
//喂婴儿吃东西
-(void)feedBaby{
NSLog(@"保姆正在喂婴儿吃东西");
}
@end
@interface Baby : NSObject
@property (nonatomic,strong) BaoMu *bm;
-(void)wantEat;
@end
@implementation Baby
-(void)wantEat{
NSLog(@"婴儿在哭...");
//保姆要喂它吃东西
[self.bm feedBaby];
}
@end
BaoMu *baomu = [BaoMu new];
Baby *baby = [Baby new];
baby.bm = baomu;
[baby wantEat];
- protocol代理模式应用场合: