2-代理

模式

对象要做某事,自己不去完成,让另一个对象去完成

通知与代理的区别

共同点:
  • 利用通知和代理都能完成对象之间的通信
    (比如A对象告诉D对象发生了什么事情, A对象传递数据给D对象)
不同点:
  • 代理 : 一对一关系(1个对象只能告诉另1个对象发生了什么事情)
  • 通知 :一对一,一对多, 多对多关系(1个对象能告诉N个对象发生了什么事情, 1个对象能得知N个对象发生了什么事情)

实现步骤

代理对象拥有目标对象属性

  1. 定义协议,代理方法
  2. 目标对象: 增加属性 id类型<协议> (使用泛型来约束)
  3. 目标对象: 使用delegate对象调用协议方法(判断协议方法是否可以响应)
  4. 代理对象: 遵守协议、实现协议方法

目标对象

//
//  Baby.h

#import <Foundation/Foundation.h>

// 协议中用到对象自己,使用 @class 去声明
@class Baby;

// 定义协议
@protocol BabyDelegate <NSObject>

// 定义代理需要执行的方法
@required
- (void)feed:(Baby*)baby;

@end



@interface Baby : NSObject

// 设置代理属性
@property(nonatomic,weak) id<BabyDelegate>delegate;
@property(nonatomic,retain) NSString *name;

// 定义方法(触发协议中的方法)
- (void)eat;

@end
//
//  Baby.m

#import "Baby.h"

@implementation Baby

// 实现方法
- (void)eat{
    
    NSLog(@"baby饿了");
    
    // 检测代理方法是否可执行
    if ([self.delegate respondsToSelector:@selector(feed:)]) {
        // 执行协议中的方法
        [self.delegate feed:self];
    }
    
}

@end


代理对象

//
//  Nurse.h

#import <Foundation/Foundation.h>
#import "Baby.h"  // 引入协议所在的头文件

// 遵守协议
@interface Nurse : NSObject <BabyDelegate>


@end
//
//  Nurse.m


#import "Nurse.h"

@implementation Nurse

// 实现协议中的方法
- (void)feed:(Baby *)baby {
    NSLog(@"喂%@吃奶",baby.name);
}

@end

mian文件

//
//  main.m

#import "Nurse.h"

@implementation Nurse

// 实现协议中的方法
- (void)feed:(Baby *)baby {
    NSLog(@"喂%@吃奶",baby.name);
}

@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容