美文网首页
delegate和protocol

delegate和protocol

作者: Patrick_QiWei | 来源:发表于2020-03-04 13:49 被阅读0次

    一直对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
    

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

    相关文章

      网友评论

          本文标题:delegate和protocol

          本文链接:https://www.haomeiwen.com/subject/znbplhtx.html