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; }
相关文章推荐
- 依附品牌做代理 把握创业新机遇
- 代理区独立模式的说明
- http代理相关知识分析
- JavaScript的事件代理和委托实例分析
- asp代理采集的核心函数代码
- nginx 1.0.0配ngx_cache_purge实现高效的反向代理
- java实现动态代理方法浅析
- 用Python编写脚本使IE实现代理上网的教程
- 在python中的socket模块使用代理实例
- 仅用50行Python代码实现一个简单的代理服务器
- Objective C从远程url下载图片方法汇总
- 在Nginx中拦截特定用户代理的教程
- 使用Nginx做WebSockets代理教程
- Windows下用Nginx代理Django安装配置实例
- 在VPS搭建自己的http代理服务器
- 当程序崩溃的时候怎么办
- socks5 代理
- nginx学习总结五(nginx反向代理)
- linux命令行界面设置代理方法