通常来讲在iOS实现delegate步骤以下: ios
在iOS应用程序级别涉及到两个类, objective-c
一个是UIApplication; 编程
一个是UIApplicationDelegate; 设计模式
咱们就以他们为例说明一下delegate机制: iphone
这就是UIApplication与UIApplicationDelegate两个类之间如何经过delegate协调工做的。 异步
委托是协议的一种,顾名思义,就是委托他人帮本身去作什么事。也就是当本身作什么事情不方便的时候,就能够创建一个委托,这样就能够委托他人帮本身去实现什么方法。 其次,我简单的总结了一下本身用到的委托的做用有两个,一个是传值,一个是传事件。 1.所谓传值常常用在b类要把本身的一个数据或者对象传给a类,让a类去展现或者处理。(切分紧耦合,和代码分块的时候常常用) 2.所谓传事件就是a类发生了什么事,把这件事告诉关注本身的人,也就是委托的对象,由委托的对象去考虑发生这个事件后应该作出什么反映。(这个常常见,例如在异步请求中,界面事件触发数据层改变等等) 3.利用委托赋值,这种方法感受是为了避免暴露本身的属性就能够给本身复值,并且这样更方便了类的管理,只有在你想要让别人给你赋值的时候才调用,这样的赋值更可控一些。(例如tableView中的委托(dateSource)中常见)。 最后,我想分享一下在使用委托的时候的一些心得和注意事项。 心得:delegate的命名要准确,尽可能看名字就知道用法。delegate和通知有的用法有些象,可是前者是单对单的,后者是单对多的状况。 注意:在dealloc要把delegate至为nil,还有就是delegate设置属性的时候要用assign,不要用retain。 委托 在IOS中委托经过一种@protocol的方式实现,因此又称为协议.协议是多个类共享的一个方法列表,在协议中所列出的方法没有响应的实现,由其它人来实现.这叫比如我想买个手机,因此我有个buyIphone 方法,可是我不知道谁那买手机,因此把这个需求发布出去(好比公布在网站上),若是有卖手机的商人(也就是说他能实现buyIphone这个方法)看到,他就会接受个人委托,(在商人本身的类中实现<XXXdelegate>),那么个人委托对象就指向了这个商人..当我要买手机的时候,直接找他就好了. 例如: 复制代码 @protocol MyDelegate -(void)buyIphone:(NSString *)iphoneType money:(NSString *)money; @end @interface My : NSObject { id<MyDelegate> deleage; } @property(assign,nonatomic)id<MyDelegate> delegate; @end 复制代码 代码中声明了一个协议 名叫Mydelegate,在其中有一个buyIphone方法,即一个委托项。当我要购买手机的时候只须要经过delegate 调用 BuyIphone方法便可. 以下: -(void)willbuy { [delegate buyIphone:@"iphone 4s" money:@"4888"]; } 我没必要关心谁现实了这一委托,只要实现了这个委托的类,而且buyIphone是声明的委托中必须实现的方法,那么就必定可以获得结果. 例如:商人类实现了这一委托(用<Mydelegate>表示实现) #import <Foundation/Foundation.h> #import "My.h" @interface Business : NSObject<MyDelegate> @end 而后在 @implementation Business 中调用 buyIphone方法 复制代码 #import "Business.h" @implementation Business -(void)buyIphone:(NSString *)iphoneType money:(NSString *)money { NSLog(@"手机有货,这个价钱卖你了,发货中!!"); } @end 复制代码 委托是Cocoa中最简单、最灵活的模式之一。委托是指给一个对象提供机会对另外一个对象中的变化作出反应或者影响另外一个对象的行为。其基本思想是:两个对象协同解决问题。一个对象很是普通,而且打算在普遍的情形中重用。它存储指向另外一个对象(即它的委托)的引用,并在关键时刻给委托发消息。消息可能只是通知委托发生了某件事情,给委托提供机会执行额外的处理,或者消息可能要求委托提供一些关键的信息以控制所发生的事情。 4 天前 上传下载附件 (18 KB) 委托方法一般包括3种动词:should、will、did。 should表示一个动做发生前,一般带有返回值,能够在动做发生以前改变对象状态。 will在动做发生前,委托能够对动做作出响应,但不带有返回值。 did在动做发生后作出的响应。 从方法的定义咱们不难看出委托模式可以起到两方面的做用: 第一:委托协助对象主体完成某项操做,将须要定制化的操做经过委托对象来自定义实现,达到和子类化对象主体一样的做用。 第二:事件监听,委托对象监听对象主体的某些重要事件,对事件作出具体响应或广播事件交给须要做出响应的对象。 我的理解采用委托模式的好处在于: 一、避免子类化带来的过多的子类以及子类与父类的耦合 二、经过委托传递消息机制实现分层解耦 委托模式的实现思路: 一、一般是在对象主体包含一个委托对象的弱引用: @interface A : NSObject { IBOutlet id delegate; } -(id) delegate; -(void) setDelegate:(id)obj; 二、委托对象的实现有两种方式:正式协议和非正式协议,对象主体在协议中定义委托方法,委托对象能够选择实现其中某些委托方法,所以若是经过正式协议定义委托方法须要使用@option。 @protocol NSSearchDelegate @option -(void)didSearchFinish:(*NSNotification) aNotification; @end 三、链接对象主体和委托,无非就是经过setDelegate:(id)obj来实现。 四、触发委托方法。 昨天作了一个demo,用到了简单代理。 delegate是ios编程的一种设计模式。咱们能够用这个设计模式来让单继承的objective-c类表现出它父类以外类的特征。昨天这个代理实现以下: 类GifView是继承自UIView的,它加载在RootViewController上来经过一个Timer播放动画。同时,RootViewController须要知道Timer的每次执行。 代码以下。 首先,定义GifView,在其头文件中定义代理EveryFrameDelegate,同时声明方法- (void)DoSomethingEveryFrame; 复制代码 #import <UIKit/UIKit.h> @protocol EveryFrameDelegate <NSObject> - (void)DoSomethingEveryFrame; @end @interface GifView : UIView { NSTimer *timer; id <EveryFrameDelegate> delegate; NSInteger currentIndex; } @property (nonatomic, retain) id <EveryFrameDelegate> delegate; @end 复制代码 而后,只要在GifView.m中让Timer在每次执行的时候调用delegate来执行DoSomethingEveryFrame,代码以下 复制代码 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(play) userInfo:nil repeats:YES]; [timer fire]; } return self; } -(void)play { [delegate DoSomethingEveryFrame]; } 复制代码 GifView上的工做就完成了。 下面是RootViewController中的代码,RootViewController只要在定义GifView的时候指定其代理为自身,就能够知道Timer的每次执行: 复制代码 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. CGRect rect = CGRectMake(0, 0, 200, 200); GifView *tmp = [[GifView alloc] initWithFrame:rect]; tmp.delegate = self; [self.view addSubview:tmp]; [tmp release]; } - (void)DoSomethingEveryFrame { NSLog(@"I'm the delegate! I'm doing printing!"); } 复制代码 GifView中Timer每次执行都会打印一行 I'm the delegate! I'm doing printing! 故,RootViewController就知道Timer的每次执行了。 作程序时,常常会碰到这样一种状况:在对象A中有一个对象B,在B中作某个操做时须要调用A对象的某个方法。这时,咱们就须要用代理机制,也叫委托机制。 还记得刚接触面向对象的时候,竟然在B对象中又alloc了一个A对象,发现执行方法时没有works,那时不理解新alloc的对象和原来的对象A不是一个东东。 今天专门补习了一下哈,在网上找了一些资料,综合了一下,写了这篇菜鸟教程。 委托代理(delegate),顾名思义,把某个对象要作的事情委托给别的对象去作。那么别的对象就是这个对象的代理,代替它来打理要作的事。反映到程序中, 首先要明确一个对象的委托方是哪一个对象,委托所作的内容是什么。委托机制在不少语言中都用到的,这只是个通用的思想,网上会有不少关于这方面的介绍。 下面以一个简单的例子介绍一下委托: 1、新建iPhone项目DelegateDemo; 2、添加UIView类ViewA; 3、ViewA.h的内容以下: [cpp] view plaincopy #import <UIKit/UIKit.h> @protocol <a href="http://www.wuleilei.com/" target="_blank"><span style="color:#ff0000">ViewADelegate</span></a>; //申明代理协议 @interface ViewA : UIView { id <<a href="http://www.wuleilei.com/" target="_blank"><span style="color:#ff0000">ViewADelegate</span></a>> _viewADelegate; } @property (nonatomic, assign) id viewADelegate; //定义代理的属性,同时要在.m加中 @end //代理协议的内容 @protocol <a href="http://www.wuleilei.com/" target="_blank"><span style="color:#ff0000">ViewADelegate</span></a> <NSObject> - (void)<span style="color:#008080">viewACallBack</span>; @end View.m中: <span> </span>@synthesize viewADelegate = _viewADelegate; 3、在DelegateDemoViewController.m中: - (void)viewDidLoad { ViewA *viewA = [[ViewA alloc] initWithFrame:CGRectMake(50, 100, 200, 100)]; viewA.viewADelegate = self; //设置viewA的代理为当前对象本身 [self.view addSubview:viewA]; [viewA release]; [super viewDidLoad]; } - (void)viewACallBack { NSLog(@"Hi, I am back!"); } 4、