OC对象的本质

Objective-C的本质
  • 我们平时编写的Objective-C代码,底层实现其实都是C\C++代码


    1.png
  • 所以Objective-C的面向对象都是基于C\C++的数据结构实现的
  • Objective-C的对象、类主要是基于C\C++的结构体实现的
  • 将Objective-C代码转换为C\C++代码
    xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o输出的cpp文件,(PS: 模拟器(i386)、32bit(armv7)、64bit(arm64))
一个OC对象在内存中的布局
  • NSObject的底层实现


    2.png

    代码获取内存大小

#import 
#import 
#import 

struct NSObject_IMPL {
    Class isa; //8个字节
};

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSObject *obj = [[NSObject alloc] init];
        
        //获得NSObject实例对象的成员变量所占用的大小 >>8
        NSLog(@"%zd",class_getInstanceSize([obj class]));
        
        //获得obj指针所指向内存的大小 >>16
        NSLog(@"%zd",malloc_size((__bridge const void *)(obj)));
        
    }
    return 0;
}
面试题
  • 一个NSObject对象占用多少内存
    1、系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
    2、但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得)

你可能感兴趣的:(OC对象的本质)