OC对象之内存大小(一)

335 阅读1分钟

总结:

    1. OC底层是c/c++实现的
    1. 将Objective-C代码转换为C\C++代码:
  • xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出的CPP文件
    1. OC对象是基于c/c++的结构体实现的
    1. OC对象的底层结构体:包含一个isa指针,该指针为struct objc_class *类型
  • struct NSObject_IMPL { Class isa; };
    1. oc对象的内存布局:
    1. 创建一个实例对象,至少需要多少内存?使用class_getInstanceSize([NSObject class]);可获得
  1. 创建一个实例对象,实际上分配了多少内存?使用malloc_size((__bridge const void *)obj);可获得,两个函数都需要导入#import <malloc/malloc.h>

  2. 底层在alloc时,会调用allocWithZone->_objc_rootAllocWithZone->_class_createInstanceFromZone,在_class_createInstanceFromZone中会获得需要分配的size,在instanceSize中会通过alignedInstanceSize去获取内存大小,注意这里的内存size是对齐过的,之后会判断是否小于16,所以分配的内存最少是16字节 `

     size_t size = alignedInstanceSize() + extraBytes;
     // CF requires all objects be at least 16 bytes.
     if (size < 16) size = 16;
     return size;   
    

`


问题:

  1. 一个NSObject对象占用多少内存?

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