大家在iOS面试的时候,是否遇到这样的面试题:一个NSObject对象占用多少内存?(我们知道不同的平台支持的代码肯定是不一样的,这里是讨论iOS下64bit (arm64))。
首先这个Objective-C的底层是C或者C++,然后是汇编语言,再然后是机器语言!

首先我们用malloc_size函数来获取一下分配的内存大小

答案是:16字节
但是这个答案是怎么来的呢?我们来探究一下!
首先底层既然是c++,我们把代码转换一下c++代码看一下底层实现

这里是代码实现,下面的main.arm64.cpp是main.m的c++底层实现,大家可以用终端执行下面的参照,2条红线的2条命令


下面用的代码

下面我们用class_getInstanceSize这个函数来获取一下NSObject类的实例对象的大小

从这里可以看出,实际NSObject对象实例大小只有8byte,但是分配了却是16byte。这是为什么呢?
二、利用lldb下的View Memory来佐证,实例大小是8byte,分配却是16byte

三、从开源源码上查看class_getInstanceSize
首先我们可以从:https://opensource.apple.com/tarballs/ 下载object的最新源码
下载下来打开搜索 class_getInstanceSize,然后打开项目


这里就很明显可以看出,class_getInstanceSize是返回类的成员变量的大小,而nsobject只有一个isa指针,大小是8byte,所以class_getInstanceSize的打印是8byte
四、探索一下NSObject对象占用16byte是如何来的
NSObject *obj = [[NSObject alloc]init]; 在objc上面搜索alloc的实现,其实alloc实现是调用allocWithZone,所以搜索一下,查找到最后

从这里可以看出,只要size传的值小于16,就会返回16,我们这个对象的值是8,返回的是16,所以malloc_size的大小是16byte
结论:
所以这道面试的答案,我认为这么写合适:
系统分配了16个字节给NSObject的对象(通过malloc_size函数获得);
但是NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得)
扩展提问:假如如下这三种情况,内存是如何分配呢?

请大家自己尝试😄!
附件代码下载链接:https://github.com/1084493818/NSObejc--day01
网友评论