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找父类

浙公网安备 33010602011771号