美文网首页技术iOS Development
iOS代理(protocol与delegate)

iOS代理(protocol与delegate)

作者: 睡不醒的小也 | 来源:发表于2016-01-21 11:01 被阅读478次

让我们先来看下protocol和delegate运用的代码,有一个整体的了解
假定有两个类:personOne和personTwo,
personOne是委托者,personTwo是代理者。

pesonOne.h
#import <Foundation/Foundation.h>
@protocol SomeThing<NSObject>
//需要被代理的事件
- (void) doSomeThing:( NSString *)someThing;
@end
@interface PersonOne : NSObject
//有件事情需要别人替自己做
//代替自己的人必须要会做这个事情,需要知道了解相关的协议;
@property (weak) id <SomeThing> delegate;
//weak:不需要为这个delegate分配空间,因为做完就走人了。
//id:只要是个对象就可以。
@end

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

相关文章

网友评论

    本文标题:iOS代理(protocol与delegate)

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