美文网首页
探索NSObject对象的本质

探索NSObject对象的本质

作者: GDCoder | 来源:发表于2021-03-08 15:36 被阅读0次

    大家在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

    相关文章

      网友评论

          本文标题:探索NSObject对象的本质

          本文链接:https://www.haomeiwen.com/subject/efzwyttx.html