复习总结2 切面编程 & 二进制优化

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指针指向创建的子类,然后把子类的forwardInvocationIMP替成__ASPECTS_ARE_BEING_CALLED__

注意

处理调用逻辑, 有before, instead, after, remove四种option插入状态。
将block转换成一个NSInvocation对象以供调用。

二进制优化

原理

image.png

利用iOS系统物理内存与虚拟内存映射的机制,把所有启动时候的代码都放在一页或者两页,这样就很大程度上优化启动速度即二进制重拍。

实现
1.Instruments调试工具 -> System Trace
调试工具,测试启动时间

2.BuildSetting -> Write Link Map File -> yes
打开项目的符号顺序输出开关

3.通过Clang获取APP启动时候调用的所有方法
Other C Flags 在里面添加相关参数,第一个启动页面里加入相应库函数和代码段

4.Build setting -> Order File
加载符号加载顺序文件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。