前面写了一点关于runtime的swizzling,其实也是对象模型的一部分,今天就来详细讲一下ios的对象模型。
那么什么叫对象模型呢,按照面向对象的设计原则来说,所有的事物都是对象,(iOS还是允许存在一些基本的数据类型,所以并没有严格遵守面向对象),同时对象也应该是另一个对象生成的实例。比如一个类生成一个实例,这个实例就叫做这个类的对象,也叫实例对象,那么问题来了,类是不是也是对象呢?iOS中有一个叫做元类的特殊类(meta class),所以类也是对象,它是元类的实例。那么元类又是谁的实例呢?所有的元类是根元类的实例,而根元类又是它自己的实例,这样就造成了一个循环,所有的都变成了对象。每一个对象都有一个isa指针,指明它是谁的对象。
那么我们再来看继承关系,既然是面向对象,那么肯定会有继承关系的,类和类(Class)之间的继承我们都知道(iOS是单继承,最后继承根类Root Class),那么我们刚才说的元类,根元类又是继承谁呢?元类继承于元类(Meta Class),最后继承根元类(Root Meta Class),然后根元类(Root Meta Class)又继承根类(Root Class)。好像有点绕了,看下面这张图:
这样是不是就很清晰了。
那么我们知道每个对象都有一个isa的指针,这样有什么用呢?当你通过一个实例对象想要调用一个类的实例方法或者属性的时候,这个实例对象就会通过isa指针到类里面去找相应的方法或者属性(没找到就会到父类找),相应的如果想要调用一个类的类方法时,是通过类的isa指针到元类中去找的(也就是说元类保存了类的类方法),这也是为什么实例对象不能调用类方法,而类方法需要用类名调用的原因了。