oc动态性, 运行时将代码转化为runtime的C代码数组
RunTime运行流程:函数
生成对应objc_msgSend方法 isa指针查看当前类有没有这个方法, 以后寻找父类, 每一个方法SEL(方法选择器)对应IMP(相似于一个编号,是函数指针,指向函数实现,找到内存里对应函数), 直到NSObeject, 若是找不到IMP, 会进入消息转发机制, resolveClassMethod, resolveInstanceMethod, forwardingTargetForSelector, forwardInvocation 第一个方法所属类方法动态方法解析, 第二个和第一个相似,是对应实例方法的, 第三个是备援接受者, 第四个方法是消息重定向, 真正消息转发,也是Aspects的核心操做, 若是都找不到调用doesNotRecognizeSelector:方法抛出异常加密
RunTime的实际应用指针
交换方法(黑魔法.hook,让SEL1->IMP2,SEL2->IMP1),为系统类添加自定义方法,三方Aspects 继承
①用方法交换添加保护, 如数组赋值时添加越界判断等等 ②统计页面点击数用 ③多继承 ④自动化归档(kvo) ⑤NSTime内存泄漏(vc被释放经过消息转发找回vc) ⑥系统类添加自定义方法, 写一些更便捷的代码,好比控件加手势,字典加加密方法,代码更简洁 内存