2-代理

作者: 千秋画雪 | 来源:发表于2016-10-30 04:14 被阅读6次

    模式

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

    通知与代理的区别

    共同点:
    • 利用通知和代理都能完成对象之间的通信
      (比如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
    

    相关文章

      网友评论

        本文标题:2-代理

        本文链接:https://www.haomeiwen.com/subject/dmgeuttx.html