设为首页 加入收藏

TOP

对Objective-c委托的理解(一)
2013-02-08 14:20:15 来源: 作者: 【 】 浏览:1499
Tags:Objective-c 委托 理解

  在我们讲到协议的时候,申明的协议都是预留方法体,方法的的具体实现,等待使用协议的人去实现。要实现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申明李先生

  <SPAN style="FONT-SIZE: 10px">//

  //  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</SPAN>

  实现李先生

  <SPAN style="FONT-SIZE: 10px">//

  //  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</SPAN>

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

  <SPAN style="FONT-SIZE: 10px">//

  //  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</SPAN>

   

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/8/8
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言的字符型数据 下一篇C、C++笔试题集锦

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: