本篇文章主要介绍了" NSObject 底层本质",主要涉及到方面的内容,对于IOS开发感兴趣的同学可以参考一下:
一、OC 转 C/C++二、NSObject 对象内存布局三、NSObject 内存大小四、OC 对象内存布局五、OC 对象内存大小一、OC 转 C/C++OC...
一、OC 转 C/C++
二、NSObject 对象内存布局
三、NSObject 内存大小
四、OC 对象内存布局
五、OC 对象内存大小
一、OC 转 C/C++
低调看直播体育app软件下载OC 的底层是通过 C\C++ 实现,所以 OC 代码编译过程一般是先将 OC 转为 C\C++ ,C\C++ 进一步转为汇编语言,最终转为机器代码。OC 的对象映射到 C\C++ 主要对应的是结构体,这里面的 “结构体” 并非 C 语言里面的结构体,而是 C++ 语言里面的结构体,而且这个概念仅限字面意思的结构体。严格来讲,其实struct关键字定义的是 类,跟 class 关键字定义的类除了默认访问权限的区别,没有区别。C++ 中的 struct 对 C 中的 struct 进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。如:能包含成员函数、可以继承、可以实现多态。
通过 xcrun 命令可以将 OC 代码转为不同平台CPU下支持的 C\C++ 代码,如 OC 代码转为 arm64 架构 CPU 代码,对应的命令为:
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出的CPP文件
二、NSObject 对象本质
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSObject *obj = [[NSObject alloc] init];
}
return 0;
}
点击可查看NSObject定义为如下,可以看出 NSObject 类中包含了一个 isa 成员变量。
@interface NSObject {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-interface-ivars"
Class isa OBJC_ISA_AVAILABILITY;
#pragma clang diagnostic pop
}
上述代码借助 xcrun 命令生成的文件中包含如下代码,实际上NSObject的定义最终也是转为如下代码。
//其中 Class 的定义为:typedef struct objc_class *Class; 64位系统中,指针占据 8 个字节
struct NSObject_IMPL {
Class isa; // 8个字节
};
NSObject *obj = [[NSObject alloc] init];的内存布局如下。alloc相当于为为右侧蓝色的结构体开辟一块空间,结构体中保存着 isa 成员,isa 成员的指针的地址相当于结构体地址空间,初始化成功后,结构体的地址赋值给 obj 对象,因此 isa 地址和 obj 地址相同。

三、对象内存大小
3.1 查看内存管大小