delegate和protocol

2020-03-04  本文已影响0人  Patrick_QiWei

一直对protocol和delegate的认识十分模糊,今天看了些文章,由此记录一下。
文章链接:
http://haoxiang.org/2011/08/ios-delegate-and-protocol/
https://blog.csdn.net/mad1989/article/details/8463460
https://imlifengfeng.github.io/article/472/

protocol和delegate完全不是一回事,放在一起说,只是因为我们经常在同一个头文件里看到这两个word。

协议(protocol):就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。
委托(delegate):顾名思义就是委托别人办事,就是当 一件事情发生后,自己不处理,让别人来处理。

举个浅显的例子:

我上班的工作主要内容包括
(1)写代码
(2)写文档
(3)测试程序
(4)接电话
(5)会见客户

(1)(2)我自己全权负责,但是后面(3)(4)(5)我不想或者不方便自己做,所以我想找个助手(delegate)帮我做这些事,于是我定了一个招聘要求(Protocol),里写明我的助手需要会做(3)(4)(5)这三件事。很快,我招到一个助手。

即:我.delegate = 助手

于是以后每当我遇到需要测试程序或者接电话的活,我就把他转交给助手(delegate)去处理,助手处理完后如果有处理结果(返回值)助手会告诉我,也许我会拿来用。如果不需要或者没有结果,我就接着做下面的事。。

delegate的用法

第一步
先定义一个协议,以”类名+Delegate “命名,这边就定义为DemoDelegate,然后再定义一个helloWorld的方法

#import <Foundation/Foundation.h>

@protocol DemoDelegate <NSObject>

- (void)helloWorld:(NSString*)name;

@end

第二步
在Demo类中声明属性并定义一个start方法去调用方法helloWorld

//Demo.h
#import <Foundation/Foundation.h>
#import "DemoDelegate.h"

@interface Demo : NSObject

@property (nonatomic) id<DemoDelegate> delegate;

- (void)start;

@end

//Demo.m
#import "Demo.h"

@implementation Demo

- (void)start {
    [_delegate helloWorld:@"patrick"];
}

@end

第三步
然后在遵守这个协议的类(譬如:ViewController.h)中实现helloWorld方法,并在viewDidLoad方法中设定demoInstance.delegate = self,然后再调用demo类中的start方法

//ViewController.h
#import <Cocoa/Cocoa.h>
#import "Demo.h"
#import "DemoDelegate.h"

@interface ViewController : NSViewController<DemoDelegate> {
    Demo* demoInstance;
}

@end

//ViewController.m
#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    demoInstance = [[Demo alloc] init];
    demoInstance.delegate = self;
    [demoInstance start];
}

- (void)helloWorld:(NSString*)name {
    NSLog(@"helloWorld ==== %@", name);
}

@end

以上如果有不正确的地方,望大神能够指正。

上一篇下一篇

猜你喜欢

热点阅读