iOS——protoco和delegate (事件代理)

一:被代理人personOne

personOne.h

#import <Foundation/Foundation.h>
@protocol SomeThing<NSObject>

//需要被代理的事件
- (void)doSomeThing:(NSString *)someThing;

@end
@interface PersonOne : NSObject

//有件事情需要别人替自己做
//代替自己的人必须要会做这个事情,需要知道了解相关的协议;
@property(weak)id <SomeThing> delegate;
@end

二:代理人personTwo

personTwo.h

#import <Foundation/Foundation.h>
#import "PersonOne.h"

@interface PersonTwo : NSObject<SomeThing>
//加上<SomeThine>表示代理人知道了相关协议,可以接手代理。
@end

personTwo.m

#import "PersonTwo.h"

@implementation PersonTwo
//代理开始去做被代理方交代的事情(必须实现)
-(void)doSomeThing:(NSString *)someThing
{
    NSLog(@"%@............",someThing);
}
@end

三.双方真正的实现相互关联

main.m

#import <Foundation/Foundation.h>
#import "PersonTwo.h"
#import "PersonOne.h"


int main(int argc, const char * argv[]) {
    @autoreleasepool {
     //真正的实现代理与被代理之间的关联
        PersonOne *pA = [[PersonOne alloc]init];
        
        PersonTwo *pB = [[PersonTwo alloc]init];
        
     //pB代替pA去完成事件
        pA.delegate = pB;
        
     //用 pA.delegate 判断是否存在pB
     //用  [pA.delegate respondsToSelector:@selector(doSomeThing:)] 判断pB是否实现了要求的方法。
        if (pA.delegate && [pA.delegate respondsToSelector:@selector(doSomeThing:)]) {
     //pA提供一个参数给pB(只负责提供参数,不管具体使用)
            [pA.delegate doSomeThing:@"hello world"];
        }
    }
    return 0;
}

 

用一个形象的比喻来说明这一整个代理事件:

一个咖啡厅生意非常好,老板 (personOne) 决定招一个咖啡师来帮忙。于是就贴出了一则公告 (delegate)

公告内容:(protocol)

招聘一名咖啡师,有一年经验以上。会调酒者优先录取。

从这个公告中,可以知道两点:

1-会做咖啡,并且有一年以上的经验是 必须的条件 (@required:必须实现的方法)

2-会调酒是 可选,非必须的条件 (@optional:可选 实现的方法(可以全部都不实现))

所以,凡是前来应聘的必须都要满足第一个条件,第二个条件只是加分项而已,并非不可缺的。

招到了员工B以后,老板要求B做一杯摩卡。至于B怎么做,老板是不会关心的,他只关心结果。

 ([pA.delegate doSomeThing:@"hello world"];) ——》[老板.delegate 做咖啡:@"摩卡"];

 

转载于:https://www.cnblogs.com/LeoMabi/p/5147305.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值