sizeof:只是一个运算符,获取占用多少字节。例如int类型返回4,double返回8
class_getInstanceSize:获取对象实际使用多少内存
malloc_size:获取系统分配给对象多少内存
OC对象的本质:结构体
:
一、OC对象的分类:
Oc中的对象,简称oc对象,主要分3种
a、instance对象(实例对象)
对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象。
b、class对象(类对象)
c、meta-class对象(元类对象)
1、Instance 对象在内存中存储的信息包括:
a、isa指针
B、其他成员变量
2、Class---类对象
Class 方法返回的一直是class对象,类对象。
获取类对象的方法:
a、objectClass1 ~ objectClass5都是NSObject的class 对象(类对象)
B、他们是同一个对象,每个类在内存中有且只有一个class对象
C、class对象在内存中存储的信息主要包括-----
1、isa指针
2、superclass指针
3、类的属性信息(@property)、类的对象方法信息(instance method)
4、类的协议信息(protocol)、类的成员变量信息(ivar)
3、meta-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 指针:
当student的instance(实例对象)调用person的对象方法时,会先通过isa找到student的class (类对象),然后通过superclass找到person的class(类对象),最后找到对象方法的实现进行调用。
4、 meta-class (元类对象)的 superclass 指针:
当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 找父类