Objective

来源:互联网 发布:做布料软件 编辑:程序博客网 时间:2024/05/29 19:25

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、为了更好的理解类的本质,下面有一副图大家可以理解一下.