博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]Objective-C Delegate
阅读量:5942 次
发布时间:2019-06-19

本文共 3600 字,大约阅读时间需要 12 分钟。

看到一篇非常非常好的文章,让你瞬间理解委托是啥。

在我们讲到协议的时候,申明的协议都是预留方法体,方法的的具体实现,等待使用协议的人去实现。要实现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 
@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 
#import "NoteDelegate.h"@interface ManagerMessage : NSObject { id
*noteDelegate;}@property (nonatomic,retain) id
*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 
#import "NoteDelegate.h"@interface IphoneDeleteViewController : UIViewController
{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指派给委托。  

好了,文章看完了,我猜你已经有了一些概念与想法了,让我来抽取出其中的关键部分:  协议:NoteDelegate看成C++中的抽象基类  主角:IPhoneDeleteViewController看成C++中的实现类  托管(代理):ManagerMessage看成观察者模式中的被关注的对象   现在,梳理一下流程  现实语义:张小姐家里有一件事要处理,可她现在没办法去办,她就告诉李先生(viewDidLoad发生),要李先生帮忙去办  模式语义:观察者IPhoneDeleteViewController先实现接口NoteDelegate内容,然后注册兴趣事件对象ManagerMessage,如果兴趣事件发生则通知自己,注册过程发生在viewDidLoad函数中。兴趣事件发生后,依据多态特性,调用messageCallBack通知观察者。   我的理解完了,不妥之处,还望指正。

原文:

by zxzhao

转载地址:http://momtx.baihongyu.com/

你可能感兴趣的文章
安装win7提示安装程序无法创建新的系统分区和定位现有系统分区
查看>>
快递查询接口的调用与解析案例
查看>>
我的友情链接
查看>>
服务器性能优化配置建议
查看>>
oracle sql语句实现累加、累减、累乘、累除
查看>>
SCNetworkReachabilityRef监测网络状态
查看>>
3D地图的定时高亮和点击事件(基于echarts)
查看>>
接口由40秒到200ms优化记录
查看>>
java 视频播放 多人及时弹幕技术 代码生成器 websocket springmvc mybatis SSM
查看>>
Activiti6.0,spring5,SSM,工作流引擎,OA
查看>>
第十三章:SpringCloud Config Client的配置
查看>>
使用 GPUImage 实现一个简单相机
查看>>
CoinWhiteBook:区块链在慈善事业中的应用
查看>>
Mac上基于Github搭建Hexo博客
查看>>
What does corn harvester involve?
查看>>
阿里云服务器ECS开放8080端口
查看>>
前端常用排序详解
查看>>
Spring中实现监听的方法
查看>>
使用Tooltip会出现一个问题,如果行上出现复选框
查看>>
11.03T1 DP
查看>>