OC 对象本质

我们平时编写的Objective-C代码,底层实现其实都是C\C++代码
对象基于 C 的 struct 来实现的

前端编译器是 clang

OC 转 C++

将Objective-C代码转换为C\C++代码
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出的CPP文件
如果需要链接其他框架,使用-framework参数。比如-frameworkUIKit

OC 底层实现

NSObject的底层实现

OC 对象内存分配

结构体内存对齐: 结构体大小的必须是最大成员大小的倍数
操作系统分配内存时的内存对齐:是 16 的倍数,方便操作系统进行操作
malloc 源码规定对象最少也要分配 16字节

1
2
3
4
5
6
7
8
9
10
// 获取NSObject 类的实例成员对象所占的大小
#import <objc/runtime.h>
class_getInstanceSize([NSObjectclass]);

// 创建一个实例对象,实际上分配了多少内存
#import <malloc/malloc.h>
malloc_size((__bridgeconstvoid *)obj);

// 本质是一个运算符、编译后就变成常数
sizeof(类型)

OC 对象的分类

instance

  1. isa指针

  2. 其他成员变量

    class

  3. isa指针

  4. superclass指针

  5. 类的属性信息(@property)、类的对象方法信息(instance method)

  6. 类的协议信息(protocol)、类的成员变量信息(ivar)

  7. ……

meta-class

每个类在内存中有且只有一个meta-class对象
meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括

  1. isa指针
  2. superclass指针
  3. 类的类方法信息(classmethod)
  4. ……

objc_getClass(const char *aClassName)

object_getClass(id obj)