hook 方案有一个好处就是可以避免代码入侵,做到更加广泛的通用性.通过 swizzling 我们可以将原 method 与自己加入的 method 相结合,即不需要在原有工程中加入代码,又能做到全局覆盖.
三种方案对比:
1,通过继承父类来实现,相对于 hook 来说,是较为准确的.因为需要被统计的页面都是继承于这个父类的控制器,而其他的如 UINavigationController,UIAlertController 等则不会误入统计数据当中.
2,上面提到 hook 方案是通过 hook UIViewController
viewDidLoad/viewDidAppear
等方法,而这些方法实际上每个 Controller 都会调用,那么就会出现不该出现的 Controller 也出现在这里 (如上面说到的
UINavigationController
和 UIAlertController).但 hook 方案一个比较好的特点是无代码入侵,在不修改项目代码的前提下完成工作.
3,两种 hook 的对比:分类的方法只要分类被 load 则就开始 hook, 时机并不能自己控制,而且也不能自己开关控制是否 hook 或者终止 hook 操作.一个由程序员主动调用(Aspects),一个由系统调用(分类).由于可控性最后还是选择了 Aspects 来进行 hook.
但要做的是通用的大数据采集类,以后公司内部所有 App 都可能会用到,在不知道是哪个 App 有什么 Controller 的情况下,hook 显然成了最好的方法.当然要注意筛选掉系统的 Controller,避免重复采集无用的数据. 如果要做内部封装的话显然 Aspects hook 的方式好一点,不然的话你就要暴露出 API 提供给分类,或者将分类写入封装类内部.这样代码比较长不利于后期维护.还有最重要的一点就是:使用 Aspects 可以留一个开关给外部,是否需要 sdk 帮助采集所有界面的出现和消失,或者交给使用者自己采集界面信息.
来源: http://www.jianshu.com/p/7c92a45ceb0d