Runtime 学习-数据结构

132 阅读1分钟

最近在研究 JSPatch,先复习巩固、查缺补漏一波 runtime 的知识。

Runtime 是什么?

后期找一个完全的定义。

查缺补漏

  1. @dynamic 告诉编译器,不自动生成 getter/setter 方法,不合成成员变量(不可使用 _var 方式访问属性),编译期是没问题的,但是当调用 setter 或者 getter 方法的时候,会发生 unrecognized selector。一般用于 CoreData 中,告诉类不要自已生成,CoreData 已经帮我生成了。

  2. @synthesize string = _string;给实例变量起个别名。iOS6 之后 @property 会自动添加 @synthesize xxx = _xxx;

  3. objc_setAssociatedObject

AssociateManager 持有一个 AssociateHashMap,里面存在的是实例与AssociateMapAssociateMap 里面存储的是 keyAssociate(包含了 valuepolicy)。

  1. load和initialize的区别

load 方法在 main 之前调用,调用顺序为 父类 > 子类 > 分类,其实很好理解,而且类的加载过程肯定是 父类 > 子类 > 分类,没父亲哪来的子呢?但是分类却要根据 complire sources 的顺序决定执行顺序。

initialize 调用顺序为 分类 > 父类,父类 > 子类。必须从父类像子类完成 initialize,而分类可以覆盖类的方法。如果子类没有实现会调用父类的 initialize不好理解的机制,求个大佬给个明确解释。

如果想父类的只执行一次,可以使用 dispatch_once

也可以使用

+ initialize {
  if (self = [XXX self]) {
      ...
  }
}
  1. Method Swizzling

本质就是交换一下 IMP 指针。

  1. NSObjectpropertyCount 为什么是 66 个?如果一个类继承于 NSObject 那么子类中获取 property 的时候为什么会有 hashsuperclassdescriptioindebugDescription 呢?求大佬解惑。
objc_property_t *propertys = class_copyPropertyList(NSObject, &propertyCount);
  1. kvc/kvo 在另一篇文章中。

深入浅出 runtime