手写代理

来源:互联网 发布:淘宝店铺怎么装修的 编辑:程序博客网 时间:2024/04/29 18:38

        凡是代理,必须有代理对象和被代理对象。举一个Baby和Nurse的例子。Baby是被代理对象,Nurse是代理对象。被代理对象做三件事情:

           1.规定要实现的方法,声明协议(需要传入一个参数,即被代理对象);

           2.提供一个代理属性;

           3.声明一个方法,该方法被代理对象所监听,当实现这个方法的时候,促使代理对象履行协议规定的方法。

       同时,代理对象要做三件事:

           1.遵循协议;

           2.设置代理;

           3.实现方法。

       如下所示:

在文件 Baby.h 里:

1.声明协议

#import <Foundation/Foundation.h>

@class Baby;(告诉编译器“Baby”是一个类)


@protocol BabyDelegate (协议的写法一般是 类型+delegate)<NSObject>


-(void)babyCryPlayWithHim:(Baby*)baby;


@end


@interface Baby:NSObject

2.提供一个代理属性

@property(nonatomic,weak)id<BabyDelegate>delegate


3.声明一个方法,该方法被代理对象所监听,当实现这个方法的时候,促使代理对象履行协议规定的方法


-(void)babyCry;


@end


在文件 Baby.m里:

#import "Baby.h"


@implementation Baby


-(void)babyCry{

     NSLog(@"baby哭了");

      [self.delegate babyCryPlayWithHim:self];

}


@end

在文件 Nurse.h 里:

#import <Foundation/Foundation.h> 

#import "Baby.h"


@interface Nurse:NSObject<BabyDelegate>(遵循协议)


@end


在文件 Nurse.m里:

#import "Nurse.h"

@implementation Nurse


-(void)babyCryPlayWithHim:(Baby*)baby{

      NSLog(@"我和baby玩耍");

}


@end


在 main.m里:

#import<Foundation/Foundation.h>

#import "Baby.h"

#import "Nurse.h"


int main(int argc, const char * argv[ ] {

       @autoreleasepool{

              创建对象

           Baby* baby=[[Baby alloc] init];

           Nurse* nurse=[[Nurse alloc] init];

           baby.delegate=nurse;(设置代理)

           [baby babyCry];(baby实现方法,此时将促使代理对象履行协议)

       }

        return 0;

}


0 0
原创粉丝点击