OC面试题 三、Runtime

316 阅读1分钟

Runtime具体应用场景

  • 利用关联对象(AssociatedObject)给分类添加属性
  • 遍历类的所有成员变量(修改textfield的占位文字颜色、查看私有变量、字典转模型、自动归档解档)
  • 交换方法实现(交换系统的方法)MethodSwizzing (系统方法不足以解决问题时)
  • 利用消息转发机制解决方法找不到的异常问题
  • 动态添加方法、创建类、属性、成员变量

isa

  • arm64架构之前,isa就是一个普通的指针,存储着 Class、Meta-Class对象内存地址
  • arm64架构开始,对isa进行了优化,变成了一个共用体(union),还使用位域来存储更多的信息。

isa - 位域

  1. nonpointer
  • 0, 代表普通的指针,存储着Class、Meta-Class对象的内存地址
  • 1,代表优化过,使用位域存储更多的信息
  1. has_assoc
  • 是否有设置过关联对象,如果没有,释放时会更快
  1. has_cxx_dtor
  • 是否有C++的析构函数(.cxx_destruct),如果没有,释放时会更快
  1. shiftcls
  • 存储着Class、Meta-Class对象的内存地址信息
  1. magic
  • 用于在调试时分辨对象是否未完成初始化
  1. weakly_referenced
  • 是否有被弱引用指向过,如果没有,释放时会更快
  1. deallocating
  • 对象是否正在释放
  1. extra_rc
  • 里面存储的值是引用计数器减1
  1. has_sidetable_rc
  • 引用计数器是否过大无法存储在isa中
  • 如果为1,那么引用计数会存储在一个叫SideTable的类的属性中。