小码哥iOS学习笔记第十三天: 动态方法解析
一、动态方法解析
- 当消息发送过程中,没有找到要调用的方法时, 就会进入
动态方法解析阶段, 源代码如下
- 在
动态方法解析过程中, 会根据类对象和元类对象进行判断, 分别处理
- 类对象调用
resolveInstanceMethod:方法
- 元类对象调用
resolveClassMethod:方法
二、实例方法的动态解析
main函数中使用Person, 调用test方法, 可以看到程序正常结束
- 移除
test方法的实现, 再次运行程序, 就会触发运行时错误unrecognized selector sent to instance
- 在
Person.m中添加+ (BOOL)resolveInstanceMethod:(SEL)sel方法, 可以发现方法被调用
- 我们可以在
+ (BOOL)resolveInstanceMethod:(SEL)sel方法中, 使用Runtime添加其他方法的实现
- 执行代码, 可以发现调用的
test方法, 执行的是other方法的实现
- 除了可以将
test方法的实现换成OC方法, 也可以换成C语言的函数
- 执行代码, 可以看到确实调用了
c_other函数的实现
调用不存在的类方法
- 准备代码,
Person只有+test的声明而没有对应的实现, 在main函数中调用[Person test]
- 在
Person.m中的方法如下所示, 将+test的实现绑定为c_other函数, 执行程序可以发现, 绑定方法成功
三、动态方法解析的过程如下