runtime是如何找到方法并执行的

95 阅读1分钟

每一个类对象中都一个对象方法列表(对象方法缓存)

Objective-C是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver, selector),整个过程介绍如下:

  1. objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类
  2. 然后在该类中的方法列表以及其父类方法列表中寻找方法运行
  3. 方法列表中每个方法结构体中记录着方法的名称,方法实现,以及参数类型,其实selector本质就是方法名称,通过这个方法名称就可以在方法列表中找到对应的方法实现,换句话说就是通过selector找到IMP指针(方法的首地址),然后直接运行
  4. 如果,在最顶层的父类(一般也就NSObject)中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX
  5. 但是在这之前,objc的运行时会给出三次拯救程序崩溃的机会,这三次拯救程序奔溃的说明见问题《什么时候会报unrecognized selector的异常》中的说明。