IOS -- Delegate委托 的 使用与理解

本文以“先学会运用 再去理解”为中心。

代码在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后就什么都不管了也不会等待接 受者的反应。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页