一直对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
以上如果有不正确的地方,望大神能够指正。
网友评论