开发者社区> thinkyoung> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Objective-c 代理模式(delegate)

简介: Objective-c 代理模式(delegate)  (2012-07-31 22:04:39) 转载▼ 标签:  杂谈 分类: iOS Objective-c 代理模式(delegate)     一、什么事代理模式?         代理模式是在...
+关注继续查看

Objective-c 代理模式(delegate)

 (2012-07-31 22:04:39)
标签: 

杂谈

分类: iOS
Objective-c 代理模式(delegate)
 
  一、什么事代理模式?
        代理模式是在oc中经常遇到的一种设计模式,那什么叫做代理模式呢? 举个例子:有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情, 而保姆就是这个代理人,  即:婴儿和保姆之间有个协议,保姆继承该协议,于是保姆就需要实现该协议中的条款成为代理人。
 
二、 代理模式的关键点:
     A完成一件事,但是自己不能完成,于是他找个代理人B 替他完成这个事情,他们之间便有个协议 (protocol),B继承该协议来完成A代理给他的事情。 
 
三、实例分析
    下面来举一个经典的实例,妈妈和保姆的例子:妈妈把孩子委托给保姆照顾,于是将需要完成的事情写成一个协议:协议声明如下:

#import <Foundation/Foundation.h>

@protocol Job <NSObject>

-(void)takeEat;

-(void)takeSleep;

-(void)takePlay;

-(void)takeShower;

@end

我们再声明Nurse类 即代理的人:

 

#import <Foundation/Foundation.h>

#import "Job.h"

@interface Nurse : NSObject<Job>//实现该协议

@end

实现文件:

 

#import "Nurse.h"

@implementation Nurse

-(void)takeEat

{

    NSLog(@"小孩饿了,喂它吃饭");

}

-(void)takeSleep

{

    NSLog(@"小孩困了,哄他睡觉");

}

-(void)takePlay

{

    NSLog(@"小孩醒来了,陪他玩");

}

-(void)takeShower

{

    NSLog(@"晚上给小孩洗澡");

}

-(void)dealloc

{

    NSLog(@"Nurse is dealloc");

}

@end

再声明一个morther类:

#import <Foundation/Foundation.h>

#import "Job.h"

@class Nurse;

@interface Morther : NSObject

{

    NSString *name;

    id<Job> delegate;   //此处声明一个代理人,从而mother可以让代理人完成需要代理的事情

}

-(id)initWithName:(NSString *)_name delagat:(id<Job>)_delagete;  //传入代理人

@property(nonatomic,copy)NSString *name;

-(void)delagateThings;// 被代理的事情

@end

//实现文件

 

#import "Morther.h"

#import "Nurse.h"

@implementation Morther

-(id)initWithName:(NSString *)_name delagat:(id)_delagete

{

    self=[super init];

    if (self) {

        if (name!=_name) {

            [name release];

            name=[_name copy];

            [delegate release];

            delegate=[_delagete retain];

        }

    }

    return self;

}

@synthesize name;

-(void)dealloc

{

    [name release];

    [delegate release];

    NSLog(@"host is dealloc");

}

-(void)delagateThings

{

    int i;

    switch (i) {

        case 1:

            [delegate takeEat];

            break;

        case 2:

            [delegate takePlay];

            break;

        case 3:

            [delegate takeShower];

            break;

        case 4:

            [delegate takeSleep];

            break;

        default:

            break;

    }

    i++;

}

@end

 

看看 在 main 文件中是怎么实现的:

 

#import <Foundation/Foundation.h>

#import "Morther.h"

#import "Nurse.h"

#import "Job.h"

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

{

 

    @autoreleasepool {

        

        NSString *name=[[NSString alloc] initWithFormat:@"小花"];

        Nurse *fengjie=[[Nurse alloc] init];//代理人 fengjie

        Morther *morther=[[Morther alloc] initWithName:name delagat:fengjie];//这样就将代理人传入mother 对象中,这样morther对象便可以通过nurse来完成她自己不能坐的事情了。

        [name release];

        [NSTimer scheduledTimerWithTimeInterval:2 target:morther selector:@selector(delagateThings) userInfo:nilrepeats:YES];  //调用机制,  2秒调用一次, 调用的对象是morther , 调用的方法是delagateThings;

        [[NSRunLoop currentRunLoop] run];  //让程序一直运行下去,保证上面的调用可以一直进行

        [morther release];

        [fengjie release];    

    }

    return 0;

}

 

代理中,需要记住的关键是在发出代理请求的类(A)中声明代理人(B)的实例变量,这样就可以保证A 能通过调用B中B代理的方法来完成B代理的事情,即自己代理给B 的事情。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Objective-C 和 Core Foundation 对象相互转换的内存管理总结
http://blog.csdn.net/likendsl/article/details/8570907
815 0
[精通Objective-C]内存管理
[精通Objective-C]内存管理 参考书籍:《精通Objective-C》【美】 Keith Lee 目录 精通Objective-C内存管理 目录 程序的内存使用情况 手动管理 MRR内存管理基本原则 使用MRR 自动引用计数 ARC规则和约定 使用ARC 处理循环引用 程序的内存使用情况 Objective-C可执
1761 0
Objective-C中的继承
#import // -------------------------------------------------- // constants for the different kinds of shapes and their colors typedef enum {...
443 0
+关注
722
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载