数据结构
objc_object:
实例对象的isa指针指向类对象,类对象的isa指针指向元类对象,元类对象的isa指针指向根元类对象
objc_class:
method_t:
关系图:
id NSObject 和 id
typedef struct objc_object *id;
表名id类型指针可以指向所有OC对象,编译器不会做类型检测,在运行时确定。NSObject会在编译时进行类型检测,保证指针指向其NSObject类或者其子类。所以id!=NSObject。id<NSObject>
表示准备了NSObject的协议,并且不做类型检测。
实例对象、类对象和元类对象关系
- 实例对象存储一些具体值
- 类对象存储实例方法
- 元类对象存储类方法
这样设计的好处是节省内存,实例对象只需要保存自己的具体值即可,如果是同一类型的实例对象,那么他们的同名方法的内部逻辑是一样的,所以在类对象中保存一份即可。然后可以根据isa指针去类对象中查找方法的实现。
方法缓存
常用方法会以
HashMap
的形式存储在cache_t中,比方便快速查找。
消息传递
消息转发
当消息没有查找到时,进入消息转发流程
Method-Swizzling
交换两个方法体