对Objective-c委托的理解

来源:互联网 发布:什么是事件驱动编程 编辑:程序博客网 时间:2024/06/04 20:06

http://blog.csdn.net/ma52103231/article/details/7564314


之前看过相关的内容,当时自以为明白了。因为人笨,再加上理解的不是很深,所以用不出来啊。只好再找篇文章看看了。

百度了一下,拜读了上面这篇文章。也做个记录,希望原创作者不要介意。呵呵。

概要:张小姐委托某人李先生去办某件事(时刻牢记这个目的,有助于下面详情的理解)

详情:

1.定义某个协议,预留空的方法。

2.定义李先生类,在李先生类的内部包含协议,并调用协议申明的方法。(李先生,实现了协议声明的方法)

3定义张小姐类型,使张小姐类型遵循前面定义的协议,并在张小姐内部实现协议中的方法。在张小姐的内部实例化李先生,并把张小姐指派给李先生内部的协议,然后由李先生调用在张小姐内部实现的协议方法。

算了,我看晕了,感觉是不是lz弄反了啊。罢了,没有去你博客评论,而是在这里背后捅你一刀,是不是不大地道啊。

我直接看代码吧,代码是王道。

  1. //  定义协议  
  2. #import <UIKit/UIKit.h>  
  3. @protocol NoteDelegate  
  4. //回调函数  
  5. -(void)messageCallBack:(NSString *)string;  
  6. @end  

定义一个类,就理解成manager类吧 ,只给人安排活,自己不干活,你看类的名字里面不是有个manager嘛,

  1. #import <Foundation/Foundation.h>  
  2. #import "NoteDelegate.h"  
  3. @interface ManagerMessage : NSObject {  
  4.     id<NoteDelegate> *noteDelegate;  
  5. }  
  6. @property (nonatomic,retain) id<NoteDelegate> *noteDelegate;  
  7. -(void)startThread;  
  8. @end
  1. #import "ManagerMessage.h"  
  2. @implementation ManagerMessage  
  3. @synthesize noteDelegate;  
  4. //开始一个线程  
  5.  -(void)startThread  
  6. {  
  7.   
  8.     [NSTimer scheduledTimerWithTimeInterval:3  
  9.                                      target:self  
  10.                                    selector:@selector(targetMethod:)  
  11.                                    userInfo:nil  
  12.                                     repeats:NO];  
  13. }  
  14. -(void)targetMethod:(NSString *)string  
  15. {  
  16.     if (self.noteDelegate!=nil) {  
  17.         //完成线程 调用回调函数  
  18.         [self.noteDelegate messageCallBack:@"回调函数"];  
  19.         }  
  20. }  

看到这里,我懂的差不多了,呵呵,回想起来了。要重点理解这个,我的理解是,这个是被委托者的地址。相当于这里已经安排好,什么时候被执行。下面这个类是真正实现这个方法的,真正干活的人。(如果说,真是先生小姐那一套的话,这个应该是正在干活的先生。)

  1. #import <UIKit/UIKit.h>  
  2. #import "NoteDelegate.h"  
  3. @interface IphoneDeleteViewController : UIViewController <NoteDelegate>{  
  4. IBOutlet UITextField *textView;  
  5. }  
  6. @property (nonatomic,retain) UITextField *textView;  
  7. @end
  1. #import "IphoneDeleteViewController.h"  
  2. #import "ManagerMessage.h"  
  3. @implementation IphoneDeleteViewController  
  4. @synthesize textView;  
  5.   
  6. //回调函数  
  7. -(void)messageCallBack:(NSString *)string  
  8. {  
  9.     self.textView.text=string;  
  10. }  
  11.   
  12. - (void)viewDidLoad {  
  13.     [super viewDidLoad];  
  14.     self.textView.text=@"测试";  
  15.     ManagerMessage *message=[[ManagerMessage alloc] init];  
  16.     //通知调用协议  
  17.     message.noteDelegate=self;  
  18.     [message startThread];  
  19.     [message release];  
  20. }  
  21.   
  22. - (void)didReceiveMemoryWarning {  
  23.     [super didReceiveMemoryWarning];  
  24. }  
  25.   
  26. - (void)viewDidUnload {  
  27.     self.textView=nil;  
  28. }  
  29.   
  30. - (void)dealloc {  
  31.     [self.textView release];  
  32.     [super dealloc];  
  33. }  
  34. @end

ManagerMessage *message=[[ManagerMessage alloc] init]; //再这里把老板,通灵出来,实例化。

    message.noteDelegate=self;  //因为之前已经继承了协议,有当奴才的资格,所以把自己的地址,告诉老板,跟老板说,协议里面的活,我来干吧

    [message startThread]; //老板执行了这个方法,这个方法调用了startThread,里面有一个noteDelegate messageCallBack,这里的

noteDelegate当然就是self啦,也就是当前类,于是就执行了当前类中的回调函数。


在我看来,楼主虽然犯了点小错误,但是瑕不掩瑜,希望能帮助到大家,以及加深自己对委托的理解。有说的不对的,请批评指正,在下初学菜鸟一枚,请多多指教。




原创粉丝点击