zoukankan      html  css  js  c++  java
  • Effective Objective-C 2.0 — 第12条:理解消息转发机制

    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

    消息转发全流程

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

  • 相关阅读:
    回来了
    【Docker】Docker学习笔记:shipyard使用
    【Docker】Docker学习笔记:安装部署
    【LVS】LVS用windows作为realserver的设置方法
    【linux常用命令】linux命令工具基础
    【linux工具】crontab
    【开源软件】windows环境下libcurl编译
    【工作笔记】CPU亲和性
    【转】多线程or多进程
    【学习笔记】git常用命令
  • 原文地址:https://www.cnblogs.com/IDRI/p/5137974.html
Copyright © 2011-2022 走看看