iOS底层学习-Day_01

问题

一个NSObject对象占用多少内存?

1、系统分配了16个字节给NSObject对象(通过malloc_size函数获得)

2、但NSObject对象内部只是用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得)

 
分析:Objective-C中,每个对象内部都有一个 isa 指针,指向该对象的类;一个类从另一角度来说也是一个对象,类也有一个 isa 指针,指向该类的元类。
因此上述代码打印出的结果,就是 NSObject 实例中 isa 指针所占用的字节数。

获取内存大小的三种方式

1、sizeof

2、class_getInstanceSize

3、malloc_size

sizeof: 1、sizeof 是一个操作符,不是函数 2、sizeof计算的是传入参数的类型的大小

class_getInstanceSize: 计算的是传入的参数(对象)所有属性(对象内部)大小相加之后内存对齐的大小(不要忘记isa;8字节对齐)

malloc_size 这个函数是 获取系统实际分配的内存大小

NSObject *objc = [[NSObject alloc] init];
NSLog(@"objc对象类型占用的内存大小:%lu",sizeof(objc));
NSLog(@"objc对象实际占用的内存大小:%lu",class_getInstanceSize([objc class]));
NSLog(@"objc对象实际分配的内存大小:%lu",malloc_size((__bridge const void*)(objc)));

 

 

1 instance的isa指向class
2 class的isa指向meta-class
3 meta-class的isa指向基类的meta-class
4 class的superclass指向父类的class
如果没有父类,superclass指针为nil

5 meta-class的superclass指向父类的meta-class
基类的meta-class的superclass指向基类的class
6 instance调用对象方法的轨迹
isa找到class,方法不存在,就通过superclass找父类
7 class调用类方法的轨迹
isa找meta-class,方法不存在,就通过superclass找父类

posted @ 2024-05-07 17:38  时光清浅、  阅读(6)  评论(0)    收藏  举报