1、什么是类?
类是用来描述对象的,是一系列属性和方法的集合
可以通过一个类来创建一个对象,对象访问该类中的属性和方法.
2、类的本质.
2.1 类可以创建对象,但类本身其实也是一个对象,这个对象会在这个类第一次被使用的时候创建.
只要有类对象,就可以通过类对象来创建实例对象.
实例对象中有一个isa指针,指向创建自己的类对象
2.2 说到这里有人问什么是isa指针,isa指针是每一个对象中都有的一个隐藏指针,这个指针指向当前对象所属的
类.当给一个实例对象方法消息的时候,会根据实例对象中的isa指针去对应的类对象中去查找对象方法.
举个例子. 一个Student类
Student实例对象中-----isa指针--->Student类对象-----isa指针--->Student元类对象-----isa指针--->根元类对象
每一个对象中都有一个isa指针,去指向创建该对象所属的那个类,根元类对象的isa指针指向自己本身!
根元类对象相当于NSObject的元类对象
2.3 类对象: 它其中存储了类中的属性和对象方法
元类对象: 存储了类中的 类方法
所以当一个对象调用一个对象方法的时候,对象的isa指针会指向类对象,去类对象中查找是否有这个对象方法
如果有,直接调用
调用类方法的时候,直接去元类对象中查找,因为元类对象中存储的都是类方法!
3、所有类的 类对象 的继承关系就是 元类对象 的继承关系.
比如Student类继承与Person类.Student类对象就继承于Person的类对象
Student的元类对象就继承与Person的元类对象
假设 Person类中有一个对象方法test,和一个类方法demo
Student类中有一个对象方法test1,和一个类方法demo1
Student *stu = [ [Student alloc] init] ;
[stu test];
[Student demo];
此时Student的实例对象调用Person类中的test方法.首先实例对象的isa指针会先去Student的类对象中
去找有没有test方法(因为类对象方法中存储的是对象方法),发现没有,会继续去Student的父类Person的
类对象中去找.找到了就调用test方法
同理Student类调用类方法demo,会先去Student的元类对象中去找,如果没有就去Student的父类
Person的元类对象中去找(因为元类对象中存储的都是类方法).
所以说 所有类的 类对象 的继承关系就是 元类对象 的继承关系.
4、为了更好的理解类的本质,下面有一副图大家可以理解一下.