浅谈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