一 delegate概念
协议是一种两个类之间的接口定义。定义了协议的类可以看作是将协议定义的方法代理给了实现他们的类。是一种引用方法的类型。一旦为代理分配了方法,代理将与该方法具有完全相同的行为。代理方法的使用可以像其他任何方法一样,具有参数和返回值。简单来说就是传入的对象,代替当前类完成某些功能,就称为代理模式。
二 delegate 使用步骤
1)定义一个协议,在其内部声明要实现的方法
2)定义一个代理类,它要遵守1)中的协议
3)定义一个被代理类,它的成员变量包含一个id类型的变量,并且要遵守1)在的协议
4)在被代理类中通过id变量调用代理类的方法、
5)在使用被代理的文件中,给id 赋值代理类。
三delegate示例
// main.m
#import <Foundation/Foundation.h>
#import "nurse.h"
#import "baby.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
nurse *nur = [nurse new];
baby *bab = [baby new];
bab.delegate = nur;
[bab baby_crying]; //baby发生行为,然后在内部由nurse类去处理这个行为
}
return 0;
}
下面是一个代理协议
// lookafter.h
#import <Foundation/Foundation.h>
@protocol lookafter <NSObject>
-(void)lookafterBaby; //协议声明
@end
下面是要实现代理协议的类
// nurse.h
#import <Foundation/Foundation.h>
#import "lookafter.h" //引入协议
@interface nurse : NSObject <lookafter>
@end
/************************************/
// nurse.m
#import "nurse.h"
@implementation nurse
-(void)lookafterBaby //实现协议
{
NSLog(@"保姆正在照看婴儿");
}
@end
下面是需要代理协议的类
// baby.h
#import <Foundation/Foundation.h>
#import "lookafter.h"
@interface baby : NSObject
@property(nonatomic,strong) id<lookafter> delegate;
-(void)baby_crying; //baby的一个行为方法
@end
/************************************/
// baby.m
#import "baby.h"
#import "nurse.h"
@implementation baby
-(void)baby_crying
{
NSLog(@"baby is crying");
[self.delegate lookafterBaby ];
}
@end
运行结果:
示意图如下: