一个NSObject对象占用多少内存

我们平时编写的Objective-C代码,底层实现其实都是c/c++代码

a. Objective-C -> C/C++ -> 汇编语言 -> 机器语言
b. 所以Objective-C的面向对象都是基于C/C++的数据结构实现的( 结构体)

  1. 如何将Objective-C代码转换成C/C++代码
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp

最后会生成一个 main-arm64.cpp的文件

#import 
#import 
#import 
// NSObject Implementation
struct NSObject_IMPL {
    Class isa; // 8个字节
};
/// isa的地址其实就是 NSObject_IMPL 结构体的地址

// 指针
//typedef struct objc_class *Class;

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSObject *objc = [[NSObject alloc] init];
        
        /// 获取对象真实占用的内存
        NSLog(@"对象真实占用的内存: %zd", class_getInstanceSize([NSObject class]));
        
        //系统为对象分配的内存
        NSLog(@"系统为对象分配的内存: %zd", malloc_size((__bridge const void *)(objc)));
    }
    return 0;
}

输出结果是

2020-06-26 14:10:33.269721+0800 OC-test01[2571:46201] 对象真实占用的内存: 8
2020-06-26 14:10:33.270102+0800 OC-test01[2571:46201] 系统为对象分配的内存: 16

我们可以下载objc的源码

https://opensource.apple.com/tarbails/

c++的结构体是有个内存对齐的原则 所以成员变量所占用的内存是最大的那个成员变量占用内存的整数倍
但是iOS系统为对象分配的内存一定是16的倍数

sizeof 是个运算符

sizeof(struct NSObject_IMPL)

是个编译期就要确定的大小

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