免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Objective-C学习之路 委托模式Objective-C学习之路 委托模式是本文要介绍内容,委托模式很重要,比如官方交互API,委托模式使用的很常见,比如UIView的setAnimationDelegate,设置动画的委托。不理解委托模式,就不能很快的理解很多API的使用,因为它们使用一样的模式,了解这个模式,就会心领神会,立即上手。下面用通俗的话说说委托模式是干什么用的。实际上Objective-C中的委托模式,类似于Java中的回调(CallBack)机制,或者说监听器机制。再或者说,类似JavaScript语言里面的onclick事件和函数的作用。比如要实现点击一个按钮之后做什么事情,这里肯定有个视图类,有个控制类,无论你是使用什么语言和开发工具。视图类能知道用户什么时候点击了按钮,但是不知道点击了以后做什么,控制类知道点击按钮后做什么,而不知道何时用户会点击。那么,可以将控制类委托给视图类,当点击的时候视图类调用控制类。如果使用过Java的Swing等做本地图形界面开发,应该知道在视图类中包含了大量的(匿名)内部类,或者要注册监听器,这些机制起到和Objective-C委托类似的功效。可以这样理解:监听器、(匿名)内部类是实现怎么做的部分,但是不知道何时会发生事情,视图类在事件发送时调用监听器、(匿名)内部类,视图类是知道何时发生事情的。写个简单的示例,是在main方法里写的,模拟一下委托在视图和控制中的作用。这里面,我有一个屏幕(Screen)类,就把它当视图吧。需求是当点击屏幕的时候爆炸。那么我有个动作(Action)类,它会实现爆炸动作。用协议实现委托模式下面的代码写的很生硬,后面会逐渐演化为合理的实现。第一个示例只是想说明技术上如何实现,没有实际运用上的意义。这里因为是模拟,可以把main方法看作是用户再操作界面,通过点击创建了个视图(Screen),然后调用Screen的实例方法onTouch,这里模拟用户用手点击了屏幕:1. #import 2. #import Screen.h 3. int main (int argc, const char * argv) 4. NSAutoreleasePool * pool = NSAutoreleasePool alloc init; 5. Screen *screen=Screen alloc init; 6. screenscreen.delegate=screen; 7. screen onTouch; 8. screen release; 9. pool drain; 10. return 0; 11. 这里先不用管:1. screenscreen.delegate=screen; 后面再说。Action类,在这里用协议来实现:1. #import 2. protocol Action 3. - (void) doAction; 4. end 是一个协议,该协议继承了NSObject协议。这里要注意,NSObject在这里不是类,确实有同名类。这个协议定义了一个doAction方法,这个方法可实现比如“屏幕爆炸”的需求。下面说说屏幕(Screen)类,头文件:1. #import 2. #import Action.h 3. interface Screen : NSObject 4. id delegate; 5. 6. property(nonatomic,retain) id delegate; 7. - (void) onTouch; 8. end 这里的onTouch方法,就是模拟Screen被用户点击后调用的方法。Screen类实现了Action协议。然后它还有个Action类型的成员delegate。为了能设置delegate实例变量,还为它设置了property。下面看看实现文件:1. #import Screen.h 2. implementation Screen 3. synthesize delegate; 4. - (void) onTouch 5. NSLog(on touch ); 6. if (delegate conformsToProtocol:protocol(Action) & 7. delegate respondsToSelector:selector(doAction) 8. delegate performSelector:selector(doAction); 9. 10. NSLog(on touched.); 11. 12. - (void) doAction 13. NSLog(Bang!); 14. 15. end 这里重点看onTouch方法内部代码,要判断delegate是否是Action协议,而且是否有doAction方法,这个判断够严谨了。如果正确,就调用Action协议的doAction方法。实际上未必要让Screen实现Action协议,虽然开发中经常是类似这样的做法。任意的实现Action协议的类实例都可以设置给screen的delegate属性。上面的示例和开发中碰到的情况不很像,实际情况往往类似下面示例的样子。首先看看main方法:1. #import 2. #import MyScreen.h 3. int main (int argc, const char * argv) 4. NSAutoreleasePool * pool = NSAutoreleasePool alloc init; 5. Screen *screen=MyScreen alloc init; 6. screen onTouch; 7. screen release; 8. pool drain; 9. return 0; 10. 这里发现增加了个MyScreen 类。它继承自Screen类。这里的代码不再设置delegate属性,因为已经在MyScreen类的init方法中设置了。后面会看到。Action协议没有变化,只是增加了optional:1. #import 2. protocol Action 3. optional 4. - (void) doAction; 5. end Screen类,可以看作抽象类,它主要供继承使用,来复用委托模式的代码。头文件:1. #import 2. #import Action.h 3. interface Screen : NSObject 4. id delegate; 5. 6. property(nonatomic,retain) id delegate; 7. - (void) onTouch; 8. end 实现文件:1. #import Screen.h 2. implementation Screen 3. synthesize delegate; 4. - (void) onTouch 5. NSLog(on touch ); 6. if (delegate conformsToProtocol:protocol(Action) & 7. delegate respondsToSelector:selector(doAction) 8. delegate performSelector:selector(doAction); 9. 10. NSLog(on touched.); 11. 12. end 这里不再实现doAction方法。下面看MyScreen类的头文件:1. #import 2. #import Screen.h 3. 4. interface MyScreen : Screen 5. 6. end MyScreen类的实现文件:1. #import MyScreen.h 2. implementation MyScreen 3. - (id) init 4. if (self=super init) 5. delegate=self; 6. 7. return self; 8. 9. - (void) doAction 10. NSLog(Bang!); 11. 12. end 用类别实现委托模式可以使用类别(Category)实现委托模式。还是上面的例子。下面使用Category实现了个示例。main方法:1. int main (int argc, const char * argv) 2. NSAutoreleasePool * pool = NSAutoreleasePool alloc init; 3. 4. Screen *screen=Screen alloc init; 5. screen onTouch; 6. screen release; 7. pool drain; 8. return 0; 9. Screen类的头文件:1. #import 2. interface Screen : NSObject 3. id delegate; 4. 5. property(nonatomic,retain) id delegate; 6. - (void) onTouch; 7. end 在这个示例中,实际上property没有起什么作用。实现文件:1. #import Screen.h 2. implementation Screen 3. synthesize delegate; 4. - (id) init 5. if (self=super init) 6. delegate=self; 7. 8. return self; 9. 10. - (void) onTouch 11. NSLog(on touch ); 12. if (delegate respondsToSelector:selector(doAction) 13. delegate performSelector:selector(doAction); 14. 15. NSLog(on touched.); 16. 17. end 写到这里,如果运行代码,只会打印类似下面的日志:1. 2011-05-26 10:37:30.843 DelegateDemo5853:a0f on touch 2. 2011-05-26 10:37:30.846 DelegateDemo5853:a0f on touched. 下面写Category代码,名称为ScreenAction,它的头文件:1. #import 2. #import Screen.h 3. interface Screen (ScreenAction) 4. - (void) doAction; 5. end 实现文件:1. #import ScreenAction.h 2. implementation Screen (ScreenAct
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 银行租赁设备合同范本
- 数据移交协议书范本
- 校园物业消防合同范本
- 2026-2031年中国三光气市场供需预测报告
- 心理委员自我评价与试题带答案
- 新员工外包合同范本
- 2026-2031年中国生物传感器市场调研及发展趋势预测报告
- 湖泊环境工程考博试题带答案
- 基于标准成本的估时作业成本法:理论重构与实践创新
- 基于构件复用的软件开发方法深度剖析与实践
- 围术期镇痛管理
- 2025浙江凯航物产有限公司招聘12人考试笔试备考试题及答案解析
- 广西华盛集团北海裕泰工艺有限责任公司招聘笔试题库2025
- 2025贵州毕节市公安局七星关分局面向社会招聘警务辅助人员280人考试笔试参考题库附答案解析
- 2027届普通高等学校招生全国统一考试青桐鸣大联考(高二)数学(人教版)
- 2025年公安基础知识考试题库及答案
- (2025)入团积极分子题库和答案(完整版)
- 2025-2030智慧渔业发展现状分析及未来趋势与产业化研究
- 企业收购项目可行性研究报告模板
- 2025年消防安全知识培训考试试题及答案
- 公司法学(第五版) 课件全套 赵旭东 第1-15章 公司与公司法-外国公司的分支机构
评论
0/150
提交评论