在我们讲到协议的时候,申明的协议都是预留方法体,方法的的具体实现,等待使用协议的人去实现。要实现oc中的委托功能,其中重要的的一个成员,就是协议。

 

网上有很多讨论关于委托的概念,有人说委托是c中的的回调函数,也有人说是java中的回调函数,也有人说委托就是代理。个人认为,给宇宙中的某个物体下定义和取名字,最好不要偏离他真实的本质,如果定义偏离本质太远,很容易误导观众。如果实在想不出一个贴切的名字去定义某个物体,那么我们可以不对某个物体下定义,我们可以直接说,“它是干什么用的”,这样既然明了,又简单。

 

在此,我并不想讨论委托是什么,我也怕误导大家,因这只是我个人的定义而已。在生活中,我们经常听到这样的话,某人张小姐委托某人李先生去办某件事,这样也就够了,你也只需要知道委托就是张先生代替张小姐去做某件事,至于他们俩之间如何协商的,我们不用管。

 

在C中可以把某个方法指派给某个指针,因此C能很方便的实现委托的效果,但是,我们我不能把C中的回调函数当成委托,C的回调函数只是实现委托效果的一个工具而已。

 

java中并没有象C中的回调函数,一般的做法就是通过接口等形式实现类似类似C中的回调函数的效果,所以以后不要说java中有回调函数。记住,你只是实现了类似C中回调函数的效果。

 

在oc中,委托的效果也是通过协议实现的,大致流程是先定义某个协议,预留空的方法。先定义李先生类,在李先生类的内部包含协议,并调用协议申明的方法。定义张小姐类型,使张小姐类型遵循前面定义的协议,并在张小姐内部实现协议中的方法。在张小姐的内部实例化李先生,并把张小姐指派给李先生内部的协议,然后由李先生调用在张小姐内部实现的协议方法。

 

下面的例子是从网上找来的

A定义协议 

 

//
//  NoteDelegate.h
//  IphoneDelete
//
//  Created by wangjun on 10-9-18.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//  定义协议
#import <UIKit/UIKit.h>
@protocol NoteDelegate
//回调函数
-(void)messageCallBack:(NSString *)string;
@end

 

B申明李先生

//
//  ManagerMessage.h
//  IphoneDelete
//
//  Created by wangjun on 10-9-18.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "NoteDelegate.h"
@interface ManagerMessage : NSObject {
    
id<NoteDelegate> *noteDelegate;
}
@property (nonatomic,retain) 
id<NoteDelegate> *noteDelegate;
-(void)startThread;

@end 

实现李先生

//
//  ManagerMessage.m
//  IphoneDelete
//
//  Created by wangjun on 10-9-18.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//
#import "ManagerMessage.h"
@implementation ManagerMessage
@synthesize noteDelegate;
//开始一个线程
 -(void)startThread
{

    [NSTimer scheduledTimerWithTimeInterval:
3
                                     target:self
                                   selector:@selector(targetMethod:)
                                   userInfo:nil
                                    repeats:NO];
}
-(void)targetMethod:(NSString *)string
{
    
if (self.noteDelegate!=nil) {
        
//完成线程 调用回调函数
        [self.noteDelegate messageCallBack:@"回调函数"];
        }
}

@end 

C申明张小姐,并使之遵循协议

//
//  IphoneDeleteViewController.h
//  IphoneDelete
//
//  Created by wangjun on 10-9-18.
//  Copyright __MyCompanyName__ 2010. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "NoteDelegate.h"
@interface IphoneDeleteViewController : UIViewController <NoteDelegate>{
IBOutlet UITextField 
*textView;
}
@property (nonatomic,retain) UITextField 
*textView;

@end 

实现张小姐

//
//  IphoneDeleteViewController.m
//  IphoneDelete
//
//  Created by wangjun on 10-9-18.
//  Copyright __MyCompanyName__ 2010. All rights reserved.
//

#import "IphoneDeleteViewController.h"
#import "ManagerMessage.h"
@implementation IphoneDeleteViewController
@synthesize textView;

//回调函数
-(void)messageCallBack:(NSString *)string
{
    self.textView.text
=string;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.textView.text
=@"测试";
    ManagerMessage 
*message=[[ManagerMessage alloc] init];
    
//通知调用协议
    message.noteDelegate=self;
    [message startThread];
    [message release];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
    self.textView
=nil;
}


- (void)dealloc {
    [self.textView release];
    [super dealloc];
}

@end 

 

总结:

要实现委托效果,在oc中最要的是,你要遵循某个协议,然后把自己self指派给委托。 

 

作者:一尘
出处:http://justinw.cnblogs.com/ 

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 

作者: 一尘 发表于 2011-05-17 15:27 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架