美文网首页
一个NSObject对象占用多少内存?

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

作者: 程序猿_K | 来源:发表于2019-05-02 15:10 被阅读0次

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

一开始想到的方法可以直接用sizeof打印,我们直接用这个打印看一下NSObject对象大小.

 NSObject *obj = [[NSObject alloc] init];
 NSLog(@"%zd",sizeof(obj));
sizeofNSObject
从打印来看,这个对象大小8字节.
所以对象大小就是8字节??我们来研究一下...

OC底层实现

OC是基于C/C++实现的,意味着编译是这个过程OC-->C/C++-->汇编--->机器码.


OC编译过程

其实OC能实现面向对象跟C++分不开,是基于C++的结构体实现.C++的结构体跟Class几乎是一样的.

1.OC利用Xcode编译成C++

$ xcrun  -sdk  iphoneos  clang  -arch  arm64  -rewrite-objc  OC源文件  -o  输出的CPP文件

2.OC对象的本质

1.将代码编译成C++

$ xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp

可以看到一个文件main-arm64.cpp,大概3万多行的代码.最终main函数转成的几行代码在最下方,也可以看到objc_msgsend的消息机制:

int main(int argc, const char * argv[]) {
    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; 
        NSObject *obj = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("NSObject"), sel_registerName("alloc")), sel_registerName("init"));
        NSLog((NSString *)&__NSConstantStringImpl__var_folders_h7_n1ts5dlj4hgg5sky9q8w7c7w0000gp_T_main_684d68_mi_0,sizeof(obj));
        return 0;
    }
}

在文件中可以到一个结构体NSObject_IMPL 基本就是NSObject实现,类似于下图,你定义一个interface,在底层就是一个结构体


NSObject底层结构体

可以看到NSObject对象的底层就只有一个isa指针,我们知道64位指针大小就是8字节.从这里看对象也是8字节.但是还有另外方式打印对象大小,OC的方法,我们试试:

#import <Foundation/Foundation.h>
#import <malloc/malloc.h>
#import <objc/runtime.h>
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...

        NSObject *obj = [[NSObject alloc] init];
        NSLog(@"%zd",malloc_size((__bridge const void *)(obj)));
        NSLog(@"%zd",class_getInstanceSize([NSObject class]));
        NSLog(@"%zd",sizeof(obj));
        return 0;
    }
}

运行结果:

运行结果
发现分配了16个字节,但是对象大小只占了8字节?

源码查看NSObject对象分配

查看objc的源码
可看到alloc的底层做了内存对齐,最少为16字节.

总结:

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

相关文章

网友评论

      本文标题:一个NSObject对象占用多少内存?

      本文链接:https://www.haomeiwen.com/subject/cgdenqtx.html