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 做咖啡:@"摩卡"];