整理OC对象占用多少字节

339 阅读1分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

查看一个NSObject占用至少多少字节的方法

  1. 查看源码,进入NSObject的头文件,有一个isa指针(指针大小为8个字节)

    TDifrd.png

  2. 将oc源码编译成c++的cpp文件,cd到工程(8个字节)

    • 编译

       clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk main.m       
      
    • 打开cpp文件

      [TDi7Pf.png

  1. sizeOf运算符获取空间的大小:(8个字节)

    sizeOf([NSObject class])

    该运算符为编译时,就可以获取大小,类似于宏定义

    下列class_getInstanceSize函数,则要在运行时获取

  1. runtime函数获取实例空间大小:

    创建一个实例对象,至少需要多少内存? (8个字节) #import class_getInstanceSize([NSObject class]);

  1. malloc获取内存空间的大小

    创建一个实例对象,实际上分配了多少内存?(16个字节)

    #import malloc_size(( *_bridge const void )obj);(注意使用桥接命令 _bridge)

  1. 利用xcode工具来查看(16个字节)

    断点后,Debug -> Debug Workfllow -> View Memory (或者快捷键Shift + Command + M)

    或者,在调试窗口输入命令:memory read/数量格式字节数 内存地址

    TDiIat.png

  1. 查看苹果开源的源码(16个字节)

    进入开源网址:opensource.apple.com,挑选数字最大,即是最新的版本

    alloc调用的底层if(size < 16) size = 16;

结论:

系统分配了16个字节给NSObject对象(通过malloc_size函数获得) 但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得)