美文网首页
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