ios中协议与委托形象解释

在IOS开发中协议和委托是两个密不可分的概念(也可以说是不同的设计模式,只不过在这里我们把他们讲在一起,因为我们常常都是这么用的):确切来说,协议[protocol]定义了一种规范,使遵循它的类具备一种能力。委托[delegate]则是制定了一种"一个类中需要做的事情交给另一个类来完成"的途径,通过委托别的类,来调用协议里的方法,委托也可以说是Object-C中实现多继承的一种方式。
委托delegate
在 apple提供的IOSSDK里可以看到很多的delegate,比如我们常用的UITableView,因为我们没有源码,就没有办法知道UITableView里的所谓的cell是如何增加,删除,复用的。但开发者面对的开发要求使开发者必须具备能够操作这些cell的能力,针对这种情况,各种Delegate就显得非常重要。
委托delegate是一个简单而强大的设计模式,在此模式中,可以允许一个对象代表另一个对象执行某个操作,或者相互协同操作。
一个很常见的场景就是网络下载数据操作,因为网络数据下载的延迟,一般都会采取多线程的机制,等到数据下载完成之后再通知主线程完成必要的操作。在这个场景中,我们完全可以在主线程实现一个代理方法,在该方法中操作下载好的数据。
协议protocol:
一个完整协议定义如下:
@protocol  协议名
声明方法
@end
其中"声明方法"可以用@required和@optional关键字修饰:
@required 表示我们用到这个协议的时候必须实现这个协议的方法
@optional 表示我们可选择性实现这些方法。
一个类需要遵循的协议在接口声明中的<>填写即可。
示例:
#import  
@interface MyViewController : UIViewController//声明继承UIViewController类,遵循UITableViewDataSource和UITableViewDelegate协议。
@property (strong, nonatomic) NSDictionary *names; 
@property (strong, nonatomic) NSArray *keys; 
@end
那么我们需要在MyViewController类中实现UITableViewDataSource和UITableViewDelegate协议里面的委托方法。
理解协议和委托的关系我们需要搞清楚如下几个问题:
1,一个对象的委托是哪个对象,需要干什么事情;
2,被委托的类需要在自身的interface中声明协议:,表示该来需要实现XXXDelega协议的方法。
3,在被委托的类里定义一个委托类的对象,并设置XXX.dalegate =self。把本类设置成委托对象。然后在本类中实现协议方法。
委托与协议分析示例:
假设公司老板日常的工作是管理公司、起草文件和接电话。
其中管理公司是老板要亲自做的。而起草文件与接电话老板希望秘书来帮忙,于是对秘书的要求就是要懂得文字编辑,要能帮助领导接电话。而这两项要求便是协议。

    //制定协议  
    //protocol.h  
    #import   
    @protocol tekuba_net   
    //起草文件  
    -(void)draftDocuments;  
    //接电话  
    -(void)tel;  
    @end  
      
    //秘书类  
    // Sec.h  
    #import   
    #import "protocol.h"  
    @interface Sec : NSObject  
    @end  
    //Sec.m  
    #import "Sec.h"  
    @implementation Sec  
    - (id)init  
    {  
        self = [super init];  
        if (self) {  
        // Initialization code here.  
        }  
        return self;  
    }  
    -(void)draftDocuments  
    {  
        NSLog(@"sec draft documents");  
    }  
    -(void)tel  
    {  
        NSLog(@"sec tel");  
    }  
    @end  
    //老板类  
    // Boss.h  
    #import   
    #import "protocol.h"  
    @interface Boss : NSObject  
    //很重要的属性-此属性对象必须实现protocol协议。在实际使用过程中常常用self.delegate = XXX.  
    @property(nonatomic,retain) id detegate; //必须有一个protocol类的对象,在实际使用过程中需要配置这里的delegate指向代理对象。  
    //管理公司  
    -(void)manage;  
    @end  
    // Boss.m  
    #import "Boss.h"  
    @implementation Boss  
    @synthesize detegate=_detegate;  
    -(id)init  
    {  
        self = [super init];  
        if (self) {  
        // Initialization code here.  
        }  
        return self;  
    }  
    -(void)manage  
    {  
        NSLog(@"boss manage");  
    }  
    -(void)draftDocuments  
    {  
        NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init];  
        [_detegate draftDocuments];  
        [p release];  
    }  
    -(void)tel  
    {  
        NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init];  
        [_detegate tel];  
        [p release];  
    }  
    @end  

那么老板就具有这3个方法,当调用前1个时是自己完成功能,而调用后2个时则转为委托调用秘书的方法。
测试用例如下:

    main.m  
    #import   
    #import "Boss.h"  
    #import "Sec.h"  
    int main (int argc, const char * argv[])  
    {  
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
        //实例化老板对象  
        Boss *boss=[[[Boss alloc] init] autorelease];  
        //实例化秘书对象  
        Sec *sec=[[[Sec alloc] init] autorelease];  
        //设置老板的代理对象为秘书  
        boss.detegate=sec;//关键代码     
        //调用各个方法。  
        [boss draftDocuments];  
        [boss tel];  
        [boss manage];  
        [pool drain];  
        return 0;  
    } 

文章原地址:http://blog.sina.com.cn/s/blog_8dabcad30101hvmb.html



看完上面的文章之后总算对ios中的委托和协议有了一个形象的了解,
虽然二者都是设计模式,但是感觉委托更有设计模式感觉,
协议(protocol)就像是java中的接口,且又可选和不可选之分,既正式协议。
接口(interface)则表示非正式协议,指 应该,而不是必须
委托方与被委托方都必须在interface中声明该协议,并且在被委托方中有方法的具体实现,
而委托方则使用类似 @property(nonatomic,retain) id detegate;配置其指向的被委托类,再又该指向被委托类的对象实现方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值