【MJ-iOS底层原理总结】NSObject的内存本质

696 阅读1分钟

1. Objective-C代码,底层实现其实都是C\C++代码。转换流程如下:

image.png

2. Objective-C的对象、类主要是基于C\C++的什么数据结构实现的?

结构体

3. 将Objective-C代码转换为C\C++代码的命令如下:

xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o xxx.cpp

  • 将main.m转换成C++代码: image.png image.png
  • 业务代码在生成的main.cpp的最底部: image.png

4. 一个OC对象在内存中是如何布局的?

  1. 首先在Xcode中查看NSObject的实现,如下:

    image.png

    • 去除宏以后如下:
    @interface NSObject {
        Class isa;
    }
    
  2. 然后在生成的源码main.cpp中,可以找到NSObject_IMPL的结构体

    image.png

    • NSObject_IMPL的意思大概可以理解为:NSObject Implementation,NSObject的实现
  3. 所以我们可以理解成,NSObject最终转换成了C++中的结构体:

    image.png

  4. 创建一个NSObject对象时的内存分配则如下图所示:

    image.png