您的位置:首页 > 移动开发 > Objective-C

Objective-C协议与代理

2015-06-22 15:59 429 查看

Objective-C协议与代理

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

协议@Protocol

如何定义一个协议

@protocol MarryProtocol <NSObject>
- (void)makeMoney;
@optional
- (void)washcloth;
- (void)cook;
@end


协议是一套标准(一堆⽅方法的声明),只有.h文件。

就像一张任务清单(或便利贴),上⾯写了⼀堆需要处理的事。

清单交给谁,谁就要去完成清单上规定的任务。

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

也可不实现。

如何遵守一个协议

遵守协议分两步

在类的.h文件 父类名后写上<协议名>。

在.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;
@end

Programmer.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];
}
@end
Assistant.h文件
#import <Foundation/Foundation.h>
#import "Programmer.h"
@interface Assistant : NSObject<AssistantProtocol>

@end
Assistant.m文件
#import "Assistant.h"

@implementation Assistant
#pragma mark 代理对象的方法实现
-(void)answerCellPhone
{
NSLog(@"马上就去接电话...");
}
-(void)meetingClient
{
NSLog(@"马上就去见客户...");
}
-(void)testWork
{
NSLog(@"马上就去做测试...");
}
@end
Main.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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  objective 代理