OC中委托和协议

一、为什么写这篇文章

我目前在编程方面是菜鸟,

这篇文章也只适合刚入行的菜鸟,

之所以写这篇文章有两个目的:

第一是为了自己复习用,

第二,为了给和我一样的菜鸟们一个参考;

我发觉好多介绍这两个概念的文章,

要么一开头就写在java中如何,在c++中如何,

大哥,我就是一菜鸟,未入行前是小白,

我只略懂oc这一门编程语言,

你给我扯什么java,C++只能令我更迷茫。

二、委托和协议的区别

委托是一种编程设计模式,
王五想找份工作,自己没门路,
就委托有门路的马六去找, 
王五要求签订一个合同(就是协议)保证帮他找到工作。
只有按照合同的条款找到帮他找到工作他才会付款。
然后马六接受了合同,
最后帮王五找到了工作,
这就是一个完整的委托了。
别再告诉我什么回调函数,什么callback 了,
我ted真听不懂,
这里王五委托马六找工作就是一个委托。

协议就是例子中的合同了,
它里面是具体的条款(方法),
马六保证都能办到(实现方法),
王五才会付钱给他。

三、王五和马六的买卖怎么做?

1、王五分析了自己找工作的需求制定了一个协议,要求钱多事儿少离家近,协议如下;

#import <Foundation/Foundation.h>

@class Wangwu;

//王五的协议内容

@protocol FindworkDelegate <NSObject>

-(void)moneyMax:(Wangwu*)WW;

-(void)treatMent:(Wangwu*)WW;

@end

2、王五的要求是只要遵守协议里的要求办任何人都可以帮我找工作,因此授权形式如下,并且开始和截止日期的决定权在王五自己手里。

@interface Wangwu :NSObject

//代理的授权范围,谁干都行,但必须遵守我的协议

@property(nonatomic,weak)id <FindworkDelegate>delegate;

-(void)goodWork;//什么时候开始找,什么时候不找我说了算。

@end


3、马六认为自己门路广可以接这个活儿,然后马六就遵守了协议帮王五去找工作;
//遵守协议条款

#import <Foundation/Foundation.h>

#import "Maliu.h"

@protocolFindworkDelegate;……//对协议进行提前声明和@class用途一致

@interface Maliu :NSObject <FindworkDelegate>

@end

//开始寻找符合王五协议要求的工作;(实现方法)

#import "Maliu.h"

#import "Wangwu.h"……//保证实现方法的时候有提示

@implementation Maliu

-(void)moneyMax:(Wangwu *)WW{

    NSLog(@"这个工作%@大大滴有钱!",WW);

}

-(void)treatMent:(Wangwu *)WW{

    NSLog(@"这个工作%@待遇大大滴好!",WW);

}

@end

4、王五开始发指令:马六啊,钱多事儿少离家近的工作赶紧帮我找,找两份啊,供我备选。

#import <Foundation/Foundation.h>

#import "Wangwu.h"

#import "Maliu.h"

int main(int argc,constchar * argv[]) {

    @autoreleasepool {

        //初始化王五和马六

        Wangwu*WW1=[[Wangwualloc]init];

        Maliu*ML=[[Maliualloc]init];

       //马六把找工作的情况反馈给王五

        WW1.delegate=ML;

        //王五放出找工作大招

        [WW1 goodWork];

       //王五再次委托马六找工作

        Wangwu*WW2=[[Wangwualloc]init];

        WW2.delegate=ML;

        //王五再次放出找工作大招

        [WW2 goodWork];

    }

    return 0;

}


5、马六说已经找好了,赶紧拿钱来

#import "Wangwu.h"

@implementation Wangwu

-(void)goodWork{

//王五说甭急,我比较下这两份工作再做决定(传回来的参数可以判断是那份工作的内容介绍)

    if ([_delegaterespondsToSelector:@selector(moneyMax:)]||[_delegaterespondsToSelector:@selector(treatMent:)]){

        [_delegatemoneyMax:self];

        [_delegatetreatMent:self];

    }

    else{

        NSLog(@"找到的工作不符合王五的要求");

    }

}

@end

6、王五说选好了,那个,啊,我支付宝给你确认下,准备收钱吧。

2016-03-14 00:51:29.005 work[3383:360865] 这个工作<Wangwu: 0x100103a60>大大滴有钱!

2016-03-14 00:51:29.008 work[3383:360865] 这个工作<Wangwu: 0x100103a60>待遇大大滴好!

2016-03-14 00:51:29.008 work[3383:360865] 这个工作<Wangwu: 0x1003001b0>大大滴有钱!

2016-03-14 00:51:29.008 work[3383:360865] 这个工作<Wangwu: 0x1003001b0>待遇大大滴好!

Program ended with exit code: 0


总结:

1、委托行为借助协议得以完成;这里王五通过FindworkDelegat协议委托马六找工作;协议要求钱多事儿少离家近;

2、并且规定必须遵守这个协议的要求找工作才可以付钱:@property(nonatomic,weak)id <FindworkDelegate>delegate;

3、委托找两份工作因此每反馈回来一次,需要判断是哪份工作的内容介绍:使用respondsToSelector:@selector(moneyMax:)方法进行判断。

Wangwu*WW1=[[Wangwu alloc]init];第一份工作


Wangwu*WW2=[[Wangwu alloc]init];第二份工作


 if ([_delegate respondsToSelector:@selector(moneyMax:)]||[_delegate respondsToSelector:@selector(treatMent:)]){

        [_delegate moneyMax:self];self是指具体是哪份工作?

        [_delegate treatMent:self];

    }

over!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值