一个NSObject对象占用多少内存
- Objective-C的面向对象都是基于C\C++的数据结构实现的。
Objective-C对象的本质是一个结构体,只有结构体才能容纳不同类型的成员属性。 - 编译 .m 文件
在main.m中
NSObject *object= [[NSObject alloc] init];
编译
*xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp*
NSObject底层实现
- NSObject底层实际是一个结构体,包含一个Class类型的 isa
- Class 实际是一个结构体指针
- 指针类型在32位系统4个字节,64位系统则为8个字节
NSObject *object= [[NSObject alloc] init];
//获取 NSObject 实例对象的成员变量所占的大小,实际利用内存
NSLog(@"%zd", class_getInstanceSize([NSObject class]));
//获取 object 指针所指向的内存大小,系统实际分配内存
NSLog(@"%zd", malloc_size((__bridge const void*)object));
//输出
22:15:41.512640+0800 First[1556:45323] 8
22:15:41.515220+0800 First[1556:45323] 16
-
一个NSObject对象创建时系统分配了16个字节内存,但NSObject内部只利用了8个字节
Student继承Person
- Person的NSObject指针(Class isa)占用8个字节,成员变量_age占用4个字节,内存对齐Person分配16个字节,实际利用12个字节
- Student的Person指针占用16个字节,_no追加到Person空余的4个字节,所以此时Student还是占用16个字节
- 当Student中再添加一个 成员变量int _sex;时,需要分配新的内存空间,虽然_sex只有4个字节大小,但根据结构体内存对齐,16*2,此时Student占32个字节
结构体的大小必须是最大成员大小的倍数
iOS操作系统内存对齐,都是16的倍数
()是运算符,在编译时执行,根据des类型编译成一个常量,int des, sizeofprint(@"%d", sizeof(des))编译时实际是print(@"%d", 4)
对象销毁
对象销毁object_dispose里面调用下面方法
image.png image.png
为什么实例对象里面只存储了成员变量没有存储方法列表
方法存储一份就够了。
sizeof()编译的时候就确定了,是一个运算符
网友评论