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

时间:2023-03-09 20:57:09
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 做咖啡:@"摩卡"];