打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Objective代理模式(delegate)
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 isdealloc");

}

@end

再声明一个morther类:

#import<Foundation/Foundation.h>

#import "Job.h"

@class Nurse;

@interface Morther : NSObject

{

    NSString*name;

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

}

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

@property(nonatomic,copy)NSString*name;

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

@end

//实现文件

 

#import "Morther.h"

#import "Nurse.h"

@implementation Morther

-(id)initWithName:(NSString *)_namedelagat:(id)_delagete

{

   self=[super init];

    if(self) {

       if (name!=_name) {

          [name release];

          name=[_name copy];

          [delegate release];

          delegate=[_delagete retain];//释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

       }

    }

    returnself;

}

@synthesize name;

-(void)dealloc

{

    [namerelease];

    [delegaterelease];

   NSLog(@"host isdealloc");

}

-(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, constchar * argv[])

{


   @autoreleasepool {

       

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

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

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

       [name release];

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

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

       [morther release];

       [fengjie release];   

    }

    return0;

}


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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
OC基础 代理模式
ios中webview的高级用法(二)
iOS网络通信http之NSURLConnection
Objective-C中类和方法的定义以及协议的使用
ios通知机制
iOS开发之使用XMPPFramework实现即时通信(三)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服