小码哥iOS学习笔记第十三天: 动态方法解析

871 阅读1分钟

一、动态方法解析

  • 已知OC中消息机制调用方法如下图所示

  • 当消息发送过程中,没有找到要调用的方法时, 就会进入动态方法解析阶段, 源代码如下

  • 动态方法解析过程中, 会根据类对象元类对象进行判断, 分别处理

  • 类对象调用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函数, 执行程序可以发现, 绑定方法成功

三、动态方法解析的过程如下