美文网首页
Runtime-(七)动态添加方法

Runtime-(七)动态添加方法

作者: 码小六 | 来源:发表于2018-11-02 23:57 被阅读0次

    在说动态添加方法之前,我们先来看一个问题

    Q: 使用performSelector:可能会遇到什么问题?

    这个方法不会检查对象的方法实现,所以可能会Crash。

    我们可以在消息传递的时候动态的添加方法。

    void testImp(void) {
        NSLog(@"this is test method!");
    }
    
    + (BOOL)resolveInstanceMethod:(SEL)sel {
        /*
         这个方法的参数:
         cls: 为哪个类添加方法
         name: 方法名
         imp: 方法实现
         types: 方法返回值和方法参数
        */
        class_addMethod(self, @selector(aTestMethod), testImp, "v@:");
        return YES;
    }
    

    动态方法解析

    Q: 是否使用过@dynamic?

    当我们声明一个属性,并且在实现中声明为@dynamic时,是告诉编译器,这个属性的get/set方法在运行时添加,而不是在编译时添加方法的实现。

    这里涉及到动态运行时语言和编译时语言的区别

    • 动态运行时语言将函数决议推迟到运行时
    • 编译时语言在编译期间决议

    Runtime实战

    Q: [obj foo]和objc_msgSend()函数之间有什么关系?

    Q: runtime如何通过Selector找到对应的IMP地址的?

    Q: 能否向编译后的类中增加实例变量?

    相关文章

      网友评论

          本文标题:Runtime-(七)动态添加方法

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