ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 网络编程 >> IOS开发 >> NSObject 底层本质

NSObject 底层本质(1/5)

来源:网络整理     时间:2018-11-01     关键词:

本篇文章主要介绍了" NSObject 底层本质",主要涉及到方面的内容,对于IOS开发感兴趣的同学可以参考一下: 一、OC 转 C/C++二、NSObject 对象内存布局三、NSObject 内存大小四、OC 对象内存布局五、OC 对象内存大小一、OC 转 C/C++OC...

  • 一、OC 转 C/C++

  • 二、NSObject 对象内存布局

  • 三、NSObject 内存大小

  • 四、OC 对象内存布局

  • 五、OC 对象内存大小

一、OC 转 C/C++

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 查看内存管大小

相关图片

相关文章