当调用一个方法 run 之后
oc方法会转变为objc_msgSend(id theReceiver, SEL selectot,……);
判断receiver是否为nil,如果是nil的话则不往下执行,返回nil,这就是为什么在oc中一个nil发送消息不会引起奔溃。
1、从方法的缓存中查找被调用过的方法会存在缓存里面,每个类都会有一个表来存被调用过的方法,以便下次更快的调用。
2、从本类的方法表(dispatch table)中查找方法寻找selector,找到则写入缓存,返回方法。否则再从父类中查找方法,如此往复,直到达到基类。如果找不到则执行方法的动态解析。
3、方法的动态解析:调用+ (BOOL)resolveInstanceMethod:(SEL)sel方法来查看是否能够返回一个selector,如果存在则返回selector。不存在进入下一步。
4、备用接受者- (id)forwardingTargetForSelector:(SEL)aSelector这个方法来询问是否有接受者可以接受这个方法呀。如果有人接受,则交给它处理,就好像一切都没发生过一样。
5.选择器方法签名- (NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector这个方法返回签名
选择器方法签名6、方法的转发:如果到这一步还不能够找到相应的Selector的话,就要进行完整的方法转发过程。调用方法-(void)forwardInvocation:(NSInvocation *)anInvocation
最后还是没有找到的话就只有呵呵了,这时候unrecognized selector sent to instance 0x100111df0'的错误就来了。
网友评论