一、OC对象的类型
1、instance 对象(实例对象)
- what
实例对象,通过alloc出来的对象,每次alloc都会产生新的对象,分别占据着不同的内存
-
在内存中存储的信息
isa指针、成员变量的值
image.png
2、class 对象
获取类对象的方法
Class objectClass1 = [obj class];
Class objectClass2 = object_getClass(obj);
类对象都是同一个对象,在内存中有且只有一个Class对象
- 在内存中存储的信息
isa指针、superclass指针
类的属性信息(@property)、类的成员变量信息(ivar)
类的对象方法信息、类的协议信息(protocol)、
3、meta-class 对象
获取元类对象的方法
Class metaClass = object_getClass([NSObject class]);
在内存中有且只有一个meta-class对象
-
在内存中存储的信息
isa指针、superclass指针
类的类方法信息
image.png
isa的指向图
image.png
从arm64开始,isa并不是直接指向上一级,而是要经过&ISA_MASK,得到上一级的地址。
image.png
4、isa和superclass的总结
接下来的部分有的绕,需要好好理解
上面我们知道了对象、类对象、和元类对象是个啥了,以及知道了每个存储了什么东西
假设有
类NSObject、 类Person、类Student、对象xiaoming
这4个玩意,其中xiaoming是Student的实例对象、Student继承Person、Person继承NSObject
由图可知 ,实例对象的isa指向类对象,类对象的isa指向元类对象,元类对象的isa指向基类的元类对对象
调用方法就跟着箭头的指向寻找,比如xiaoming要调用Peron的方法1,xiaoming先通过isa指针找到Student,Student通过superclass指针找到Person,再调用相对应的方法
网友评论