Objective-C协议与代理

来源:互联网 发布:软件平台验收报告 编辑:程序博客网 时间:2024/05/29 12:02

Objective-C协议与代理

标签(空格分隔): objective-c


协议@Protocol

  1. 如何定义一个协议
@protocol MarryProtocol <NSObject> - (void)makeMoney;@optional- (void)washcloth; - (void)cook; @end

协议是一套标准(一堆⽅方法的声明),只有.h文件。
就像一张任务清单(或便利贴),上⾯写了⼀堆需要处理的事。
清单交给谁,谁就要去完成清单上规定的任务。

协议中的方法默认是必须实现的,即@required。 关键字 @optional 修饰的方法是可选的,可实现
也可不实现。

  1. 如何遵守一个协议
    遵守协议分两步
  2. 在类的.h文件 父类名后写上<协议名>。
  3. 在.m文件中实现协议中的方法。相当于给这个类添加了若干个方法。这个类的实例就可以调用这些方法。
#import “MarryProtocol”@interface Boy : NSObject <MarryProtocl> ...@end@implementation Boy//协议中⽅方法的实现@end

代理模式

Protocol的核心使用场景是实现delegate设计模式。
比如,程序员上班的工作有
1. 写代码
2. 写文档
3. 做测试
4. 接电话
5. 见客户
第一 二件事必须由我自己完成,但是后面的事既可以由我完成也可以让别人替我完成,所以我想找一个助手(delegate)帮我做这些事,于是我定义了一个招聘要求 即协议@protocol,写明我的助手需要会做这三件事情。
很快助手来了,即我.delegate = 助手;
于是以后每当我遇到需要测试程序或者接电话的活,我就把他转交给助手(delegate)去处理,助手处理完后如果有处理结果(返回值)助手会告诉我,也许我会拿来用。如果不需要或者没有结果,我就接着做下面的事。

Programmer.h文件#import <Foundation/Foundation.h>#pragma mark 写定协议内容@protocol AssistantProtocol <NSObject>-(void)testWork;-(void)answerCellPhone;-(void)meetingClient;@end#pragma mark 声明遵守协议@interface Programmer : NSObject<AssistantProtocol>{    id<AssistantProtocol>delegate;}#pragma mark 代理的setter getter 方法@property (retain,nonatomic) id<AssistantProtocol>delegate;-(void)coding;-(void)writeDoc;@endProgrammer.m文件#import "Programmer.h"@implementation Programmer@synthesize delegate;-(void)coding{    NSLog(@"我在写代码...");}-(void)writeDoc{    NSLog(@"我在写文档....");}#pragma mark 协议方法的实现均由代理来完成。-(void)testWork{    [delegate testWork];}-(void)answerCellPhone{    [delegate answerCellPhone];}-(void)meetingClient{    [delegate meetingClient];}@endAssistant.h文件#import <Foundation/Foundation.h>#import "Programmer.h"@interface Assistant : NSObject<AssistantProtocol>@endAssistant.m文件#import "Assistant.h"@implementation Assistant#pragma mark 代理对象的方法实现-(void)answerCellPhone{    NSLog(@"马上就去接电话...");}-(void)meetingClient{    NSLog(@"马上就去见客户...");}-(void)testWork{    NSLog(@"马上就去做测试...");}@endMain.m文件#import <Foundation/Foundation.h>#import "Programmer.h"#import "Assistant.h"int main(int argc, const char * argv[]) {    @autoreleasepool    {        Programmer *p = [Programmer new];//创建一个程序员对象        Assistant *a = [Assistant new];//创建一个助手对象        [p setDelegate:a];//双方签署协议        [p answerCellPhone];//助手代理程序员完成各种工作        [p testWork];        [p meetingClient];    }    return 0;}
0 0