iOS 调用对象的方法发生了什么?

1、先根据对象的 isa 指针找到该对象的类对象,即该对象所属的类;

2、在该类对象的缓存方法列表里面查找该方法,找到即执行响应方法;

3、如果没找到,向该类对象的方法列表里面查找该方法,找到即执行响应方法;

4、如果没找到,根据该类对象的父对象指针,去父对象里去执行2、3步骤;

5、如果没找到,转向拦截调用,走消息转发机制;

消息转发机制:

1、是否动态的去添加这个方法去处理:+(BOOL)resolveInstanceMethod:(SEL)sel或者+(BOOL)resolveClassMethod:(SEL)sel 。返回值为No时,进入第二步;

2、转发给其他对象,是否能实现这个方法:- (id)forwardingTargetForSelector:(SEL)aSelector 。返回值为nil时,进入下一步;

3、返回一个方法签名:- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector 。

  方法签名返回正确的话,执行 - (void)forwardInvocation:(NSInvocation *)anInvocation ,这个方法可以转发到多个对象中;

4、再没找到就会crash

如果找到了:

在方法中找到IMP指针,执行具体实现。

向一个nil对象发送消息将会发生什么?

如果向一个nil对象发送消息,首先在寻找对象的isa指针时就是0地址返回了,所以不会出现任何错误。也不会崩溃。

 

posted on 2020-02-22 16:29  xiao孛  阅读(344)  评论(0编辑  收藏  举报