本文以“先学会运用 再去理解”为中心。
代码在ARC条件下书写的。
先说如何使用:
程序存在两个控制器 分别是 ViewController 与 NextViewController。
1.在NextViewController.h 申明我们的delegate
#import <UIKit/UIKit.h>
#import "ViewController.h"
@protocol MyDelegate <NSObject>
- (void)buyAppleWatch;
@end
@interface NextViewController : UIViewController
@property (assign,nonatomic) id<MyDelegate> mydelegate;
@end
2.在NextViewController.m 实现我们的delegate该在何时发起。(代码里是 点击button后调用backAction方法。关键代码是
[self.mydelegate buyAppleWatch]; )
#import "NextViewController.h"
@interface NextViewController ()
@end
@implementation NextViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor yellowColor];
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
button.frame = CGRectMake(100, 100, 100, 30);
button.backgroundColor = [UIColor redColor];
[button addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
- (void)backAction{
[self.mydelegate buyAppleWatch];
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
3.在ViewController.m 去实现delegate的方法。关键步骤为 ViewController要遵守的协议中加入之前定义的delegate的名称<MyDelegate> 然后设置Delegate的委托对象并实现Delegate中定义的方法 nextVC.mydelegate = self 和
-(void)buyAppleWatch;
#import "ViewController.h"
#import "NextViewController.h"
@interface ViewController ()<MyDelegate>
{
NextViewController *nextVC;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
nextVC = [[NextViewController alloc]init];
nextVC.mydelegate = self;
}
- (IBAction)buttonAction:(id)sender {
[self presentViewController:nextVC animated:YES completion:nil];
}
-(void)buyAppleWatch{
NSLog(@"U get it,iWatch");
}
@end
下面来说说对于delegate的理解:
关于delegate 和 protocol 有一个例子讲:
我上班的工作主要内容包括 (1)写代码(2)写文档(3)测试程序(4)接电话(5)会见客户。
(1)(2)我自己全权负责,但是后面(3)(4)(5)我不想或者不方便自己做,所以我想找个助手(delegate)帮我做这些事,于是我定了一个招聘要求(Protocol),里写明我的助手需要会做(3)(4)(5)这三件事。很快,我招到一个助手。
即:我.delegate = 助手。
于是以后每当我遇到需要测试程序或者接电话的活,我就把他转交给助手(delegate)去处理,助手处理完后如果有处理结果(返回值)助手会告诉我,也许我会拿来用。如果不需要或者没有结果,我就接着做下面的事。
其实delegate只是一种模式,大家约定俗成,当把自己内部一部分实现暴露给另外一个类去做的时候,就叫实际做事的类为delegate,当然你也可你把它命名为任何名字;
最后说说delegate优缺点:
优势 :
1.非常严格的语法。所有将听到的事件必须是在delegate协议中有清晰的定义。
2.如果delegate中的一个方法没有实现那么就会出现编译警告/错误
3.协议必须在controller的作用域范围内定义
4.在一个应用中的控制流程是可跟踪的并且是可识别的;
5.在一个控制器中可以定义定义多个不同的协议,每个协议有不同的delegates
6.没有第三方对象要求保持/监视通信过程。
7.能够接收调用的协议方法的返回值。这意味着delegate能够提供反馈信息给controller
缺点 :
1.需要定义很多代码:1.协议定义;2.controller的delegate属性;3.在delegate本身中实现delegate方法定义
2.在释放代理对象时,需要小心的将delegate改为nil。一旦设定失败,那么调用释放对象的方法将会出现内存crash
3.在一个controller中有多个delegate对象,并且delegate是遵守同一个协议,但还是很难告诉多个对象同一个事件,不过有可能。
delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值,也就是delegate方法的结果。比如-windowShouldClose:,需要关心返回的是yes还是no。所以delegate方法往往包含 should这个很传神的词。也就是好比你做我的delegate,我会问你我想关闭窗口你愿意吗?你需要给我一个答案,我根据你的答案来决定如何做下一步。相反的,notification最大的特色就是不关心接受者的态度,我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。所以notification往往用did这个词汇,比如NSWindowDidResizeNotification,那么NSWindow对象放出这个notification后就什么都不管了也不会等待接 受者的反应。