最近在研究 JSPatch,先复习巩固、查缺补漏一波 runtime 的知识。
Runtime 是什么?
后期找一个完全的定义。
查缺补漏
-
@dynamic告诉编译器,不自动生成getter/setter方法,不合成成员变量(不可使用_var方式访问属性),编译期是没问题的,但是当调用setter或者getter方法的时候,会发生unrecognized selector。一般用于CoreData中,告诉类不要自已生成,CoreData已经帮我生成了。 -
@synthesize string = _string;给实例变量起个别名。iOS6之后@property会自动添加@synthesize xxx = _xxx;
AssociateManager 持有一个 AssociateHashMap,里面存在的是实例与AssociateMap,AssociateMap 里面存储的是 key 和 Associate(包含了 value 和 policy)。
load 方法在 main 之前调用,调用顺序为 父类 > 子类 > 分类,其实很好理解,而且类的加载过程肯定是 父类 > 子类 > 分类,没父亲哪来的子呢?但是分类却要根据 complire sources 的顺序决定执行顺序。
initialize 调用顺序为 分类 > 父类,父类 > 子类。必须从父类像子类完成 initialize,而分类可以覆盖类的方法。如果子类没有实现会调用父类的 initialize。不好理解的机制,求个大佬给个明确解释。
如果想父类的只执行一次,可以使用 dispatch_once。
也可以使用
+ initialize {
if (self = [XXX self]) {
...
}
}
本质就是交换一下 IMP 指针。
NSObject的propertyCount为什么是 66 个?如果一个类继承于NSObject那么子类中获取property的时候为什么会有hash、superclass、descriptioin、debugDescription呢?求大佬解惑。
objc_property_t *propertys = class_copyPropertyList(NSObject, &propertyCount);
-
kvc/kvo在另一篇文章中。