面试中: 一个NSObject对象占用多少内存?

答案是:16个字节

Object-C的本质

Object-C -> C\C++ -> 汇编语言 -> 机器语言

所以Objective-C的面向对象都是基于C\C++的数据结构实现的

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

结构体

OC验证

  • 代码
#import 

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSObject *obj = [[NSObject alloc] init];
    }
    return 0;
}

  • 将Objective-C代码转换为C\C++代码
    不同平台支持的代码不一样
平台
Windows
Mac
iOS
iOS平台下架构
模拟器i386
32bit armv7
64bit arm64

参数 说明
xcrun 使用 xcode 工具
-sdk 支持平台
clang 编译器
-arch 架构
-rewrite-objc 重写OC文件
-o 输出路径,CPP(c++)

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

  • main-arm64.cpp中
// NSObject 在内存中,就是此结构体
struct NSObject_IMPL {
    Class isa;
};
  • 结构体中的Class
// 就是指向这个结构体的指针
typedef struct objc_class *Class;
  • 既然是指针

32位架构中,指针是占用4个字节
64位架构中,指针是占用8个字节

// 由此,我们分析
// NSObject*obj=[[NSObject alloc]init]的代码本质
[[NSObject alloc] init];
等于
struct NSObject_IMPL {
  Class isa;
};

---------------------------------------------

NSObject *obj 存储开辟的这个NSObject对象的内存地址
obj 就是 isa的地址

如上所知NSObject对象是8个字节,我们在用代码验证一下

NSObject *obj = [[NSObject alloc] init];
        
// 获得NSObject实例对象的成员变量所占用的大小 
// 打印结果 8
NSLog(@"%zd", class_getInstanceSize([NSObject class]));

// 获得obj指针所分配内存的大小
// 打印结果 16
NSLog(@"%zd", malloc_size((__bridge const void *)obj));

我们的问题是占用,所以是分配了多少内存,所以是16
当我们创建NSObject对象,会分配给我们16个字节,但我们实际利用中,只用到了8个字节


Object-C 源码地址

objc4源码可以找到class_getInstanceSize实现

你可能感兴趣的:(面试中: 一个NSObject对象占用多少内存?)