对Objective-c委托的理解

来源:互联网 发布:移动硬盘怎么恢复数据 编辑:程序博客网 时间:2024/05/18 03:28
看到一篇非常非常好的文章(http://blog.csdn.net/ma52103231/article/details/7564314),让你瞬间理解委托是啥。

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

 

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

 

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

 

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

 

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

 

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

 

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

A定义协议 

[cpp] view plaincopyprint?
  1. //  
  2. //  NoteDelegate.h  
  3. //  IphoneDelete  
  4. //  
  5. //  Created by wangjun on 10-9-18.  
  6. //  Copyright 2010 __MyCompanyName__. All rights reserved.  
  7. //  定义协议  
  8. #import <UIKit/UIKit.h>  
  9. @protocol NoteDelegate  
  10. //回调函数  
  11. -(void)messageCallBack:(NSString *)string;  
  12. @end  

B申明李先生

[cpp] view plaincopyprint?
  1. <span style="font-size:10px;">//  
  2. //  ManagerMessage.h  
  3. //  IphoneDelete  
  4. //  
  5. //  Created by wangjun on 10-9-18.  
  6. //  Copyright 2010 __MyCompanyName__. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10. #import "NoteDelegate.h"  
  11. @interface ManagerMessage : NSObject {  
  12.     id<NoteDelegate> *noteDelegate;  
  13. }  
  14. @property (nonatomic,retain) id<NoteDelegate> *noteDelegate;  
  15. -(void)startThread;  
  16. @end</span>  

实现李先生
[cpp] view plaincopyprint?
  1. <span style="font-size:10px;">//  
  2. //  ManagerMessage.m  
  3. //  IphoneDelete  
  4. //  
  5. //  Created by wangjun on 10-9-18.  
  6. //  Copyright 2010 __MyCompanyName__. All rights reserved.  
  7. //  
  8. #import "ManagerMessage.h"  
  9. @implementation ManagerMessage  
  10. @synthesize noteDelegate;  
  11. //开始一个线程  
  12.  -(void)startThread  
  13. {  
  14.   
  15.     [NSTimer scheduledTimerWithTimeInterval:3  
  16.                                      target:self  
  17.                                    selector:@selector(targetMethod:)  
  18.                                    userInfo:nil  
  19.                                     repeats:NO];  
  20. }  
  21. -(void)targetMethod:(NSString *)string  
  22. {  
  23.     if (self.noteDelegate!=nil) {  
  24.         //完成线程 调用回调函数  
  25.         [self.noteDelegate messageCallBack:@"回调函数"];  
  26.         }  
  27. }  
  28. @end</span>  

C申明张小姐,并使之遵循协议
[cpp] view plaincopyprint?
  1. <span style="font-size:10px;">//  
  2. //  IphoneDeleteViewController.h  
  3. //  IphoneDelete  
  4. //  
  5. //  Created by wangjun on 10-9-18.  
  6. //  Copyright __MyCompanyName__ 2010. All rights reserved.  
  7. //  
  8.   
  9. #import <UIKit/UIKit.h>  
  10. #import "NoteDelegate.h"  
  11. @interface IphoneDeleteViewController : UIViewController <NoteDelegate>{  
  12. IBOutlet UITextField *textView;  
  13. }  
  14. @property (nonatomic,retain) UITextField *textView;  
  15. @end</span>  

实现张小姐
[cpp] view plaincopyprint?
  1. <span style="font-size:10px;">//  
  2. //  IphoneDeleteViewController.m  
  3. //  IphoneDelete  
  4. //  
  5. //  Created by wangjun on 10-9-18.  
  6. //  Copyright __MyCompanyName__ 2010. All rights reserved.  
  7. //  
  8.   
  9. #import "IphoneDeleteViewController.h"  
  10. #import "ManagerMessage.h"  
  11. @implementation IphoneDeleteViewController  
  12. @synthesize textView;  
  13.   
  14. //回调函数  
  15. -(void)messageCallBack:(NSString *)string  
  16. {  
  17.     self.textView.text=string;  
  18. }  
  19.   
  20. - (void)viewDidLoad {  
  21.     [super viewDidLoad];  
  22.     self.textView.text=@"测试";  
  23.     ManagerMessage *message=[[ManagerMessage alloc] init];  
  24.     //通知调用协议  
  25.     message.noteDelegate=self;  
  26.     [message startThread];  
  27.     [message release];  
  28. }  
  29.   
  30. - (void)didReceiveMemoryWarning {  
  31.     [super didReceiveMemoryWarning];  
  32. }  
  33.   
  34. - (void)viewDidUnload {  
  35.     self.textView=nil;  
  36. }  
  37.   
  38. - (void)dealloc {  
  39.     [self.textView release];  
  40.     [super dealloc];  
  41. }  
  42. @end </span>  

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

好了,文章看完了,我猜你已经有了一些概念与想法了,让我来抽取出其中的关键部分:
协议:NoteDelegate看成C++中的抽象基类
主角:IPhoneDeleteViewController看成C++中的实现类
托管(代理):ManagerMessage看成观察者模式中的被关注的对象

现在,梳理一下流程
现实语义:张小姐家里有一件事要处理,可她现在没办法去办,她就告诉李先生(viewDidLoad发生),要李先生帮忙去办
模式语义:观察者IPhoneDeleteViewController先实现接口NoteDelegate内容,然后注册兴趣事件对象ManagerMessage,如果兴趣事件发生则通知自己,注册过程发生在viewDidLoad函数中。兴趣事件发生后,依据多态特性,调用messageCallBack通知观察者。

我的理解完了,不妥之处,还望指正。

原创粉丝点击