先上代码:
Baby.h文件
#import <Foundation/Foundation.h>
#import "BAOMU.h"
@interface Baby : NSObject
@property(nonatomic,assign)int age;
@property(nonatomic,weak)id<BAOMU> baomu;
- (void)cry;
- (void)sleep;
- (void)play;
@end
Baby.m文件
#import "Baby.h"
@implementation Baby
- (void)cry
{
NSLog(@"%d的baby哭了",self.age);
[_baomu babycry:self]; // 通知保姆,让保姆去帮助完成要做的事情
}
- (void)sleep
{
NSLog(@"%d的baby困了",self.age);
[_baomu babysleep:self]; // 通知保姆,让保姆去帮助完成要做的事情
}
- (void)play
{
NSLog(@"%d的baby要出去玩",self.age);
[_baomu babyplay:self]; // 通知保姆,让保姆去帮助完成要做的事情
}
@end
@protocol BAOMU 文件
#import <Foundation/Foundation.h>
@class Baby;
// 在这里要用前置声明的方式,防止交叉包含产生错误
@protocol BAOMU <NSObject>
- (void)babycry:(Baby*)ababy;
- (void)babysleep:(Baby*)ababy;
- (void)babyplay:(Baby*)ababy;
@end
Nurse.h文件
#import <Foundation/Foundation.h>
#import "BAOMU.h"
@interface Nurse : NSObject<BAOMU>
@end
Nurse.m文件
#import "Nurse.h"
#import "Baby.h"
@implementation Nurse
- (void)babycry:(Baby*)ababy
{
NSLog(@"护士安慰%d岁的baby",ababy.age);
}
- (void)babysleep:(Baby*)ababy
{
NSLog(@"护士哄%d岁的baby睡觉",ababy.age);
}
- (void)babyplay:(Baby*)ababy
{
NSLog(@"护士陪%d岁的baby玩",ababy.age);
}
@end
到底谁才能成为Baby的代理呢,必须要能够帮助Baby完成一些事,那么又如何保证一个代理一定就能帮助Baby完成一些事呢
这里就需要声明一个协议,协议里面声明了一些方法可以帮助Baby完成"一些事",要成为Baby的协议就必须遵循这个协议,并且实现协议里面的方法,
这样就保证了每个代理都能够帮助Baby完成一些事,因为这里只要能够帮助Baby做一些事情的对象都可以做Baby的代理,
所以将Baby的代理声明为 id 类型的.
main()函数测试:
#import <Foundation/Foundation.h>
#import "Baby.h"
#import "Nurse.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Nurse* nurse = [[Nurse alloc] init];
Baby* baby = [[Baby alloc] init];
baby.age =2;
[baby setBaomu:nurse];
[baby cry];
[baby sleep];
[baby play];
}
return 0;
}
运行结果如下:
这里Baby没有显示的调用协议里面的方法,而代理却时时刻刻的监听到了Baby的动作,
baby 哭了, 代理自动调用 - (void)babycry:(Baby*)ababy 方法;
baby 困了, 代理自动调用 - (void)babysleep:(Baby*)ababy 方法;
baby 要出去玩 , 代理自动调用 - (void)babyplay:(Baby*)ababy 方法;
这就是代理的功能!