
先在main.m定义了一个继承于NSObject的类 然后通过命令行 xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m 获得生成的C\C++代码 打开生成后的main.cpp可以看到




IMPL的意思就是implementation实现的意思上图可以看的比较清楚在OC的头文件里面NSObject底层实现就是左边里面只有一个成员变量isa,在底层实现里面NSObject本质他就是一个结构体(图的右边)。Class点进去看就是一个指向结构体的指针,在64位环境下占8个字节,所以NSObject在内存中就占8个字节,但是真正的的情况是占16个字节,通过运行时runtime可以发现,且看下面分析。





是通过一个instanceSize的方法返回最后的大小,而instanceSize方法里面写的最低返回就是16个字节,硬性规定了最少16个字节。如果是NSObject的话通过size_t size = alignedInstanceSize() + extraBytes;拿出来的是8个字节。方法alignedInstanceSize返回的是成员变量大小,extraBytes额外的一般来说是0字节。



刚才我们通过源码了解到系统为obj分配了16个字节,上图绿色框框中框出了16个字节,1个16进制位代表4个2进制位,2个16进制位就代表8个2进制位,也就是1个字节。前8个字节就代表isa,后面8个字节都是00,再后面就不是0,所以能推断出这16个字节是连续的,红色框框框的就是其它的内存,最严谨的方法还是通过运行时获取。
最后总结一下就是:
1.一个NSObject对象占用多少内存?
系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得)
创建一个实例对象,至少需要多少内存?
#import <objc/runtime.h>
class_getInstanceSize([NSObject class]);
创建一个实例对象,实际上分配了多少内存?
#import <malloc/malloc.h>
malloc_size((__bridge const void *)obj);
有兴趣的可以自己新建一些复杂的继承NSObject的对象看看内存再根据源码自己验证分析一下

网友评论