二、使用步骤
1>定义一份协议
2>B遵守协议,实现相应的方法
3>A中要定义一个代理属性id<协议>delegate
4>创建B对象,设置A的delegate对象为
相当于在A中一致在调用B中的方法,如果B这个对象为nil的话,就不执行B相应的方法,如果B对象不为空,就会执行B中的方法
程序入口:
#import <Foundation/Foundation.h>
#import "Baby.h"
#import "Dog.h"
int main(int argc,const char * argv[])
{
@autoreleasepool {// 2.婴儿
Baby *b = [[Babyalloc] init];
b.age = 1;
b.baomu = [[Dogalloc] init];
[b cry];
}
return 0;
}
实体类的声明:
#import <Foundation/Foundation.h>
#import "BabyBaomuXieyi.h"
@interface Baby : NSObject
@property (nonatomic,strong) id<BabyBaomuXieyi> baomu;// 任何人都能做保姆,但是要遵守BabyBaomuXieyi
@property (nonatomic,assign) int age;// 年龄
- (void)hungry; //饿了
- (void)cry; // 哭了
- (void)sleep; // 想睡觉
@end
实体类的实现
#import "Baby.h"
@implementation Baby
- (void)cry
{
NSLog(@"%d岁的baby哭了", _age);
// 通知保姆(护士)
[_baomu babyCry:self];
}
- (void)sleep
{
NSLog(@"%d岁的baby想睡觉", _age);
// 通知保姆
[_baomu babySleep:self];
}
- (void)hungry
{
NSLog(@"%d岁的baby想吃东西", _age);
// 通知保姆
[_baomu babyHungry:self];
}
@end
声明协议
#import <Foundation/Foundation.h>
@class Baby;
@protocol BabyBaomuXieyi <NSObject>
- (void)babyCry:(Baby *)baby;
- (void)babySleep:(Baby *)baby;
- (void)babyHungry:(Baby *)baby;
@end
实现代理的实体
#import <Foundation/Foundation.h>
#import "BabyBaomuXieyi.h"
@interface Dog : NSObject <BabyBaomuXieyi>
@end
实现代理相关方法
#import "Dog.h"
#import "Baby.h"
@implementation Dog
- (void)babyCry:(Baby *)baby
{
NSLog(@"狗正在安慰%d岁的baby", baby.age);
}
- (void)babyHungry:(Baby *)baby
{
NSLog(@"狗喂%d岁的baby吃东西", baby.age);
}
- (void)babySleep:(Baby *)baby
{
NSLog(@"狗哄%d岁的baby去睡觉", baby.age);
}
@end
经过程序逻辑,我们可以发现,如果Baby想要找baomu,那么这个baomu就必须遵守协议,不然baomu这个对象就不会被赋值,只有遵守协议的baomu,才有照顾baby的资格。在IOS的UI中有许多的Delegate这个玩意儿,他们的总体思路就是在代码里面调用代理对象相关的方法,如果这个代理对象为nil,那么发送的消息就不会被执行,如果我们设置了代理,并且重写相关的方法,那么代理对象就会起作用。