闲来无事,学习底层
作为一名iOS开发者,我们整体所写的OC对象,它的本质到底是什么???
先从一道问题开始说起:
一个NSObject对象占用多少内存
OC对象底层实现其实就是C/C++代码
OC ------>C/C++------>汇编语言------>机器语言(二进制语言010101)
OC对象(NSObject)本质其实就是结构体
验证 :将OC代码转换成C/C++代码(tips:cpp 即 c plus plus C++)
打开终端
clang -rewrite-objc main.m -o main.cpp
生成指定架构的C++文件
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp
如下图所示
两种不同格式的cpp文件
打开 main-arm64.cpp
可以全局搜索NSObject_IMPL得到如下内容(结构体)
struct NSObject_IMPL {
Class isa;
};
//说明一个NSObject对象其本质就是结构体struct NSObject_IMPL
isa 64位里面指针占据8个字节,32位里面占据4个字节
最后看下内存图
内存图
最后上所有代码以及源码
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <malloc/malloc.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
NSObject * object = [[NSObject alloc]init];
NSLog(@"%zd",class_getInstanceSize([NSObject class]));//获取类的实例对象的成员变量所占用的存储空间的大小结果是8
NSLog(@"%zd",malloc_size((__bridge const void *)(object)));//获取objc指针指向内存的大小结果为16
}
return 0;
}
源码
size_t instanceSize(size_t extraBytes) {
size_t size = alignedInstanceSize() + extraBytes; //NSObnect 此处为8
if (size < 16) size = 16;
return size;
}
总计:系统分配了16个字节给NSObject对象(通过malloc函数获得),但NSObject对象内部只使用了8个字节空间(通过class_getInstanceSize函数获得 ) (64bit下)
补充一般:String字符串:8个字节,int:4个字节 double:4个字节
网友评论