9.5 彩蛋放送

9.5.1 从UIMenuItem切入,找到小视频对象

在9.2.7节中,从WCTimeLineViewController切入,找到了小视频对象。但这个过程并不顺利,因为没有找到通过C直接访问M的方法,所以才“不得已”从tableView:cellForRowAtIndexPath:中寻找小视频对象的线索,最终达到了目标。如果跳出MVC的通用思路,从微信本身的角度考虑问题,事情或许可以简单得多。

一起来思考:长按小视频播放窗口,会出现菜单。选择菜单中的选项,会对小视频做出相应的操作——也就是说,UIMenuItem的action中可能会有小视频对象的线索。在图9-11中,我们曾看到过“Favorite”选项的响应函数,即onFavoriteAdd:,那就去IDA中看看它的实现是怎样的吧,如图9-32所示。

图9-32 [WCContentItemViewTemplateNewSight onFavoriteAdd:]

从图9-32可以看到,这个函数的开头部分出现了我们熟悉的WCDataItem、contentObj和mediaList。如果当时从这个函数入手,整个分析过程的工作量至少可以减轻一半。看来,虽然以MVC标准为线索从App切入代码是一条通用的思路,但打破常规往往能取得意想不到的效果,让iOS逆向工程变得更好玩。

9.5.2 微信历史版本头文件个数变迁

从微信历代版本头文件数量的变迁中(如图9-33到图9-38所示)可以看出,微信是如何一步步迈向优秀的。不积跬步无以至千里,向微信致敬。

图9-33 微信不同版本的头文件目录

图9-34 微信3.0,995个头文件

图9-35 微信4.5,2267个头文件

图9-36 微信5.0,3734个头文件

图9-37 微信5.1,3537个头文件,比5.0版还少几个

图9-38 微信6.0,5225个头文件

经历3、4、5、6这4个大版本的迭代,微信的头文件个数从最初的不足1000到现在突破5000,增加了5倍有余。随着微信在全球范围内的普及,App头文件个数突破10000已经指日可待了。