消息机制

对于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的处理可以从下面链接找到,写得不错

IOS 消息转发 -

你可能感兴趣的:(消息机制)