Aspect切面编程
定义
切面编程:
以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
Aspects简介:
Aspects github地址:https://github.com/steipete/Aspects.git
Aspect是一个基于metho swizzing的iOS函数替换的第三方库,他可以很好的实现勾取一个类或者一个对象的某个方法
#pragma mark - Public Aspects API
+ (id<AspectToken>)aspect_hookSelector:(SEL)selector
withOptions:(AspectOptions)options
usingBlock:(id)block
error:(NSError **)error {
return aspect_add((id)self, selector, options, block, error);
} //钩一个类所有实例方法中的某一个方法
- (id<AspectToken>)aspect_hookSelector:(SEL)selector
withOptions:(AspectOptions)options
usingBlock:(id)block
error:(NSError **)error {
return aspect_add(self, selector, options, block, error);
} //钩取一个实例对象的某一个方法
实现原理
基于消息转发
Aspects主要是利用了forwardInvocation
进行转发,Aspects利用和kvo
类似的原理,通过动态创建子类的方式,把对应的对象isa
指针指向创建的子类,然后把子类的forwardInvocation
的IMP
替成__ASPECTS_ARE_BEING_CALLED__
注意
处理调用逻辑, 有before, instead, after, remove四种option插入状态。
将block转换成一个NSInvocation
对象以供调用。
二进制优化
原理
利用iOS系统物理内存与虚拟内存映射的机制,把所有启动时候的代码都放在一页或者两页,这样就很大程度上优化启动速度即二进制重拍。
实现
1.Instruments调试工具 -> System Trace
调试工具,测试启动时间
2.BuildSetting -> Write Link Map File -> yes
打开项目的符号顺序输出开关
3.通过Clang获取APP启动时候调用的所有方法
Other C Flags 在里面添加相关参数,第一个启动页面里加入相应库函数和代码段
4.Build setting -> Order File
加载符号加载顺序文件