• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Effective Objective-C 2.0 — 第12条:理解消息转发机制

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

 

消息转发全流程

以完整的例子演示动态方法解析

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
总结Objective-c常用算法发布时间:2022-07-12
下一篇:
TIOBE 7 月编程语言排行榜:C# 被 VB.NET 反超,Objective-C 重回前十 ...发布时间:2022-07-12
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap