2019-12-26------ NSObject 相关概念(MJ底层原理笔记)

sizeof:只是一个运算符,获取占用多少字节。例如int类型返回4,double返回8

class_getInstanceSize:获取对象实际使用多少内存

malloc_size:获取系统分配给对象多少内存

OC对象的本质:结构体

2019-12-26------ NSObject 相关概念(MJ底层原理笔记)_第1张图片

一、OC对象的分类:

Oc中的对象,简称oc对象,主要分3种

a、instance对象(实例对象)

对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象。

b、class对象(类对象)

c、meta-class对象(元类对象)

1Instance 对象在内存中存储的信息包括:

a、isa指针

B、其他成员变量

2Class---类对象

       Class 方法返回的一直是class对象,类对象。

获取类对象的方法:

2019-12-26------ NSObject 相关概念(MJ底层原理笔记)_第2张图片

a、objectClass1 ~ objectClass5都是NSObject的class    对象(类对象)

B、他们是同一个对象,每个类在内存中有且只有一个class对象

C、class对象在内存中存储的信息主要包括----- 

1、isa指针

2、superclass指针

3、类的属性信息(@property)、类的对象方法信息(instance method)

4、类的协议信息(protocol)、类的成员变量信息(ivar)

3meta-class 对象 (元类对象)

    获取方法:

a、objectMetaClass是NSObject的meta-class对象(元类对象)

B、每个类在内存中有且只有一个meta-class对象

C、meta-class 对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括:

1、isa指针

2、superclass指针

3、类的类方法信息(class method)

4、查看Class是否为 meta-class

BOOL result = class_isMetaClass([NSObject class]);

二、对象的 isa 指向哪里

1、instance (实例对象)的 isa 指向 class (类对象):

当调用 对象方法时,通过 instance (实例对象) isa 找到 class (类对象),最后找的对象方法的实现进行调用。

2、class (类对象)的 isa 指向 meta-class (元类对象):

当调用 class (类对象)时,通过 class (类对象) 的 isa 找到 meta-class (元类对象),最后找到类方法的实现进行调用。

3、 class (类)对象的 superclass 指针:

2019-12-26------ NSObject 相关概念(MJ底层原理笔记)_第3张图片

当student的instance(实例对象)调用person的对象方法时,会先通过isa找到student的class  (类对象),然后通过superclass找到person的class(类对象),最后找到对象方法的实现进行调用。

     

4、 meta-class (元类对象)的 superclass 指针:

2019-12-26------ NSObject 相关概念(MJ底层原理笔记)_第4张图片

当student的class(类对象)调用person的类方法时,会先通过isa找到student的meta-class  (元类对象),然后通过superclass找到person的meta-class  (元类对象),最后找到类方法的实现进行调用。

5、isa 、superclass 总结

instance 的 isa 指向 calss,

class isa 指向 meta-class

meta-calss isa 指向基类的 meta-class

class superclass 指向父类的 class

如果没有父类,superclass 指针为 nil

meta-class superclass 指向父类的 meta-class

如果meta-class superclass 指向基类的class 

instance 调用对象方法的轨迹

isa找到 class ,方法不存在,就通过superclass 去父类里面找

class调用类方法的轨迹

isa meta-class ,方法不存在,就通过superclass 找父类

你可能感兴趣的:(2019-12-26------ NSObject 相关概念(MJ底层原理笔记))