美文网首页
iOS委托理解

iOS委托理解

作者: Shawn_Wang | 来源:发表于2015-09-25 19:32 被阅读315次

    iOS委托

    委托是协议(protocol)的一种,就是委托别人去做事情。可以理解成两个对象之间的一种协议,假设a是b的delegate,当b不想做事的时候让它的delegate对象a去做。
    举例:一个Boss类,Boss功能管理员工,培训,发工资,打电话给员工。但是过了一段时间后,Boss想我这样太累了,我打算请一个秘书(Secretary)来帮我做事情。发工资和打电话这两件事情交给她就做就好了。于是有以下情况:
    1.定义协议

    #import <Foundation/Foundation.h>
    
    @protocol SecProtocol <NSObject>
    
    //pay salary
    - (void)payOff;
    //make call
    - (void)makeCall;
    @end
    

    2.Boss类

    #import <Foundation/Foundation.h>
    #import "SecProtocol.h"
    
    @interface Boss : NSObject
    //这一属性用于指定秘书对象,对象实现协议内容
    @property (nonatomic, weak) id<SecProtocol> delegate;
    - (void)manage;
    - (void)teach;
    - (void)doPayOff;
    - (void)doMakeCall;
    @end
    ////////
    #import "Boss.h"
    
    @implementation Boss
    - (void)teach {
        NSLog(@"boss teach emloyees");
    }
    
    - (void)manage {
        NSLog(@"boss manage employees");
    }
    
    - (void)doPayOff {
        [self.delegate payOff];
    }
    
    - (void)doMakeCall {
        [self.delegate makeCall];
    }
    
    - (id)init {
        self = [super init];
        if (self) {
            //
        }
        return self;
    }
    @end
    

    3.Secretary类

    #import <Foundation/Foundation.h>
    #import "SecProtocol.h"
    
    @interface Secretary : NSObject<SecProtocol>
    
    @end
    //////
    #import "Secretary.h"
    
    @interface Secretary ()
    
    @end
    @implementation Secretary
    //实现协议方法
    - (void)payOff {
        NSLog(@"yes, sir.I will pay off");
    }
    
    - (void)makeCall {
        NSLog(@"yes, sir.I will make call");
    }
    
    - (id)init {
        self = [super init];
        if (self) {
            //
        }
        return self;
    }
    @end
    

    4.实现
    调用前两个是Boss自身方法,后2个调用秘书的方法,这里秘书对象叫做代理对象。
    delegate就是对象的引用,delegate对象必须遵循协议中规定来实现协议中方法。boss.delegate = sec。将老板的代理对象设为秘书对象,sec作为delegate对象就必须实现SecProtocol中的方法。

    #import <Foundation/Foundation.h>
    #import "Boss.h"
    #import "Secretary.h"
    
    
    int main(int argc, const char * argv[]) {
       @autoreleasepool {
           Boss *boss = [[Boss alloc] init];
           Secretary *sec = [[Secretary alloc] init];
           //设置老板的代理对象为秘书。
           boss.delegate = sec;
           [boss teach];
           [boss manage];
           [NSThread sleepForTimeInterval:5.0f];
           [boss doPayOff];
           [boss doMakeCall];
       }
       return 0;
    }
    
    

    相关文章

      网友评论

          本文标题:iOS委托理解

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