RunTime
runtime 是 OC 底层的实现, 也是 OC 在其上封装的面向对象的基石, 所有的 OC 代码, 在编译的时候都被转成 runtime 的代码, OC 的动态特性也是因为 runtime.
通过
clang -rewrite-objc xxx.m
可以看到编译后的xxx.cpp
文件
比如一个简单的OC代码: [[NSObject alloc] init]
, 从编译后的文件中可以看到, 我们去掉各种转换的语句后, 生下来的就是
1 | objc_msgSend(), sel_registerName() |
这些方法, 可以看出, 调用方法的本质就是发消息, 这个 alloc|init
就发送了2次消息, 一次alloc
, 一次init
它可以
- 运行时动态添加属性, 类, 方法 class_add…
- 运行时动态修改属性, 类, 方法 class_exchang..
- 运行时动态删除属性, 类, 方法 class_remove…
- 大概就是看它 API 里提供什么, class 开头, 或者是 Method 开头等
- 方法一般是要改哪个类就建立一个分类, 在里面实现要替换的方法, 在加载这个分类的 load 方法里实现替换, 具体替换的方法里在调用被替换的原方法(即调用自己名字的方法)
- 可以在源头把经常报错的源头给替换下方法做个判断来过滤这些错误
参考帖子和里面的 Demo