Effective Objective-C 2.0 — 第12条:理解消息转发机制
2016-01-17 22:31
459 查看
11 条讲解了对象的消息传递机制
12条讲解对象在收到无法解读的消息之后会发生什么,就会启动“消息转发”(message forwarding)机制,
- 若对象无法响应某个选择子,则进入消息转发流程。
- 1,通过运行期的动态方法解析功能,可以在需要用到某个方法时再将其加入类中。
- 2,对象可以把其无法解读的某些选择子转交给其他对象来处理。
- 经过上述两步之后,如果还是没办法处理选择子,那就启动完整的消息转发机制。
动态方法解析
对象在收到无法解读的消息之后,首先调用其所属类的下列类方法
+ (BOOL)resolveInstanceMethod:(SEL)selector
返回值为BOOL,表示这个类是否能新增一个实例方法用以处理此选择子。
使用这种方法的前提是:相关方法的实现代码已经写好,只等着运行的时候动态插在类里面就可以了。此方案常用来实现@dynamic属性,比如说要访问CoreData框架中NSManagedObjects对象的属性时就可以这么做,因为实现这些属性所需的存取方法在编译期就能确定。
下列代码演示了如何用“resolveInstanceMethod:”来实现@dynamic实行;
id autoDictionaryGetter(id self, SEL _cmd); void autoDictionarySetter(id self, SEL _cmd, id value); + (BOOL)resolveInstanceMethod:(SEL)selector { NSStirng *selectorString = NSStringFromSelector(selector); if (/*selector is from a @dynamic property */) { if ([selectorString hasPerfix:@"set"]) { class_addMethod(self, selector, (IMP)autoDictionarySetter, "v@:@"); } else { class_addMethod(self, selector, (IMP)autoDictionaryGetter, "@@:"); } return YES; } } return [super resolveInstanceMethod:selector]; }
首先将选择子转化为字符串,检测其是否表示设置方法。
备援接受者
- (id)forwardingTargetForSelector:(SEL)selector
完整的消息转发
首先创建NSInvocation 对象,把与尚未处理的那条消息有关的全部细节都封于其中。此对象包括 selector、target、及参数在触发NSInvocation 对象时,“消息派发系统”(message-dispatch system)将亲自出马,把消息指派给目标对象。
- (void)forwardInvocation:(NSInvocation *)invocation
消息转发全流程
以完整的例子演示动态方法解析
相关文章推荐
- css学习笔记20160117字体
- jQuery自动与手动图片切换效果下载
- css重点章节复习—布局-边框-边距-浮动 (部分)
- HTML学习1
- web前端响应式设计总结
- JavaScript之对象序列化详解
- HTML基础01
- jquery的$是什么意思与相关的
- Fastjson示例代码
- Html中插入javascript不识别问题
- Html中插入javascript不识别问题
- bootstrap.css两个友好插件
- angular规范
- bootstrap-fileupload-上传文件控件
- JavaScript系列(三:函数)
- 【React Native开发】React Native库版本升级(Upgrading)与降级讲解(6)
- Codeforces 607 A Chain Reaction
- 在jsp页面中使用basePath
- WEB-INF/views/menu/list.jsp (line: 26, column: 58) equal symbol expected
- jQuery UI 实例 - 自动完成(Autocomplete)