Runtime相关

121 阅读1分钟

数据结构

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

交换两个方法体