对于OC的函数,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。
当OC对象调用一个方法时,动态调用,根据实例对象(本质上是一个有isa指针指向类对象的结构体)的isa指针找到实例的类对象,(如果是对象方法就在实例的类对象方法列表中,如果是类方法,则还要往上找元类)然后从方法列表中选择对应的SEL,通过SEL(选择器)调用方法,实际是SEL,只是具体实现方法的索引值(通过它找到IMP(具体实现的函数指针)
首先会去类对象的方法缓存列表中查找,如果找到了就调用该方法(实际找到的是一个函数指针(IMP),比较OC底层就是C),如果没有找到就到类对象的方法列表中查找,如果还没有找到,就到对象的父类对象中查找,重复上一步的动作,如果一直到最后还是没有找到的话,程序会崩溃
当没有找到实现方法时,会调用如下函数。
//动态方法解析
+(BOOL) resolveInstanceMethod:(SEL)selector
+(BOOL)resolveClassMethod:(SEL)sel
//备用接收者
-(id)forwardingTargetForSelector:(SEL)aSelector
//完整地消息转发
-(NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector
-(void)forwardInvocation:(NSInvocation *)anInvocation
当没有找到实现方法时,OC的处理可以从下面链接找到,写得不错