浅谈系列-OC方法调用到底是个什么流程

浅谈系列-OC对象创建出来到底是怎么样的呢

浅谈OC方法调用

导语:上一篇我们大概了解OC对象内存结构,那么方法是如何调用成功的呢?我们来简单谈一下,不会太深入runtime去说,后面说runtime和消息机制再深入探讨(本人萌新,如有误,请一定指正,感谢)

  • 上一篇浅谈可以得知,对象方法储存在类对象(class)中,类方法储存在元类对象(meta-class)中

对象方法

实例对象(instance)要调用对象方法
1.通过isa指针 -> 找到自己所属的类对象 -> 查找并调用方法
2.如果在自己的类对象没有找到方法,通过类对象的superclass指针 -> 找到父类的类对象 ->查找并调用方法
3.如果还没有找到,就通过superclass指针一直通过继承关系往上找,直到基类的类对象,如果还是没有找到,抛出异常

类方法

类对象(class)调用类方法
1.类对象通过isa指针 -> 找到自己的元类对象 -> 查找并调用方法
2.如果没有找到,通过元类对象的superclass指针 -> 找到父类的元类对象 -> 查找并且调用方法
3.如果还是没有找到,根据继承体系,通过元类对象的superclass指针一直找到基类的元类对象,查找并调用方法
4.如果基类的元类对象也找不到该类方法,会通过基类元类对象的superclass指针找到基类的类对象,查找有没有同名的对象方法,找到就调用,没有就抛出异常

注意:

无论是类方法还是对象方法,查找方法的原则就是先查找本类(或者元类),再通过继承关系往上找(比如调用一个父类的类方法,肯定是先在自己的元类对象找,再往上找。绝不会先通过类找到父类,再找父类的元类这种操作查找方法,因为系统是不会提前知道你调用的是父类的类方法的)

虽然,类在找不到对应的类方法之后,有可能会调用到基类同名的对象方法(通过superclass指针),但是对象就算找不到对象方法,是不会到基类的元类对象中查找同名的类方法的。(我也不知道苹果是怎么考虑的,如果有哪个大神知道,请指教一下,谢谢)。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享