美文网首页
读李峰峰博客笔记之动态方法解析

读李峰峰博客笔记之动态方法解析

作者: 扑倒的柔情 | 来源:发表于2017-03-17 17:22 被阅读6次
    • ** 如果我们使用关键字 @dynamic 在类的实现文件中修饰一个属性,表明我们会为这个属性动态提供存取方法,编译器不会再默认为我们生成这个属性的 setter 和 getter 方法了,需要我们自己提供 **
    • 当 Runtime 系统在 Cache 和类的方法列表(包括父类)中找不到要执行的方法时,Runtime 会调用一下两个方法来给我们一次动态添加方法实现的机会:
    /* 添加实例方法 */
    resolveInstanceMethod:
    /* 添加类方法 */
    resolveClassMethod:
    /* 完成向特定类添加特定方法实现的操作 */
    class_addMethod
    
    • 下面的例子为 resolveThisMethodDynamically 方法添加了实现内容,就是 dynamicMethodIMP 方法中的代码。其中 “v@:” 表示返回值和参数。示例代码:
    void dynamicMethodIMP(id self, SEL _cmd)
    {
        // implementation ....
    }
    @implementation MyClass
    + (BOOL)resolveInstanceMethod:(SEL)aSEL
    {
        if (aSEL == @selector(resolveThisMethodDynamically))
        {
              class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, "v@:");
              return YES;
        }
        return [super resolveInstanceMethod:aSEL];
    }
    @end
    
    • ** 注意:动态方法解析会在* 消息转发机制侵入前 *执行 **
    • ** 动态方法解析器将会首先给予提供该方法选择器对应的 IMP 的机会。如果你想让该方法选择器被传送到转发机制,就让 resolveInstanceMethod: 方法返回 NO。 **

    相关文章

      网友评论

          本文标题:读李峰峰博客笔记之动态方法解析

          本文链接:https://www.haomeiwen.com/subject/vyoenttx.html