Runtime-(七)动态添加方法

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

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: 能否向编译后的类中增加实例变量?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 2016年国庆假期终于把此书过完,整理笔记和体会于此。 关于书名 书名源于俄罗斯的演员斯坦尼斯拉夫斯基创作的《演员...
    李剑飞的简书阅读 12,067评论 2 65
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,057评论 3 119
  • 当你某一天遇到某个人的时候,你可能会觉得自己不够美好,不够完美。遇见那个人,一切都改变了。 愿亲爱的你,温柔如水,...
    唐云杉阅读 1,558评论 1 2
  • “愿不愿意去极乐世界?” “愿意!” “想不想快点去?” “想!” “真的想假的想?” “真的!” 佛来了,垂手接...
    弥陀教我念弥陀阅读 2,784评论 4 5

友情链接更多精彩内容