《高性能iOS应用开发》封面

  • 当应用首次工作出错以后,79% 的用户只会再重试一两次 —— 你还有挽救的机会!
  • 当应用载入时间超过 3 秒时,25%的用户会放弃使用该应用 —— 就算你的App再漂亮,启动慢了也不行!
  • 31% 的用户会将糟糕的体验转告他人 —— 不只是AppStore上的差评哟!

如果你想跻身于顶尖ios开发人员之列,那么上面几个统计数据你得注意了⚠️ —— 你的App能否被用户认可不仅仅取决于功能,还取决于当与用户交互时,应用能否提供流畅的体验(也就是性能)。在AppStore上寻找某一类应用,无论是电商、游戏、社交还是旅游和天气,大部分你都能找到不只一个款,这意味着你的App体验不好,用户自然可以选别的 —— 就算你绞尽脑汁搞出一款“独一无二”的应用,如果App性能不好,人家也不会用你的。

上述种种问题是如何导致的?可能不仅仅是程序的Bug那么简单,因素可能多种多样,本书第一部分在开篇为我们指出了十四个大的方向——内存、电量消耗、初始化时间、执行速度、响应速度、内存本地存储、互操作性、网络环境、带宽、数据刷新、多用户支持、单点登录、安全、崩溃。同时也指出了性能分析的两种主要方式——采样和埋点。


解决问题要抓主要矛盾,所以第二部分讨论了影响我们App性能最主要的三大块:内存管理、能耗以及并发。

为什么内存要放在第一位?我们在开发桌面乃至浏览器程序的时候,一般来说并不会优先考虑内存的问题,因为现在台式机或者笔记本电脑的内存还是挺够用的,更不用说跑在服务器上的服务端程序了。但是对于手机(iPhone)和平板(iPad)而言,内存资源目前确实是非常有限的,所以iOS实际上是设置了单个进程的内存使用上限,根据苹果公司的数据,90%的App因为不当的内存管理而崩溃。显然,根据二八原则,我们要把内存这个主要矛盾处理好。首先我们要了解内存耗在了什么地方?内存消耗分为两部分:栈大小和堆大小。关于什么是堆和栈,任何一本与数据结构相关的书都不会放过它们,此处不再赘述。栈大小受制于如下几个因素:(1)可被递归调用的最大方法数、(2)一个方法中最多可以使用的变量个数、(3)视图层级中可以嵌入的最大视图深度。前两点对于性能的影响,自己写个通过递归实现的计算斐波那契数列的函数就可以体会到,第三点则实际上是前两点的衍生品——视图层级一多,递归的数量以及变量自然就多。第二章用一系列代码例子解释了iOS的内存管理模型,并深入细节的告诉我们该如何“自动”的释放内存、释放池块、引用计数等等。通过这些代码,我们可以学会跟踪内存使用情况、避免发生循环引用,从而达到减少内存的消耗、降低平均和峰值内存,最终避免我们的程序走向崩溃。

目前对于移动设备或者移动应用而言,最大的制约之一就是能耗,大家都关心手机充一次电能用多久,如果用了你的App发现电吊得特别快,那么你的App就有可能被用户忍痛割爱!能耗的原因是什么,虽然网络硬件、蓝牙、GPS、麦克风、加速计、摄像头、扬声器和屏幕都是产生能耗的硬件,但是大头其实是CPU,或者再直接点说,取决于你让CPU做了多少的计算——计算越多,耗电就越快。在减少计算量上是没有银弹的,只有根据具体情况采取具体的措施,比如排序算法,列表少于 43 个实例,则插入排序优于归并排序,当实例多于 286 个时,则应使用快速排序。还有些方法,就是把计算挪个地方,比如客户端和服务端都可以做的计算,我们可以放在服务端去算。再比如,可以采用优化静态编译(ahead-of-time,AOT)处理……总之,要么我们在硬件上想些办法——例如当应用进入后台时,释放部分硬件的锁定,比如:蓝牙、相机、扬声器、麦克风;要么就在如何让CPU算得更少上面做文章。当然,也可以在用户体验上做些文章,比如让App在适当的时机提示用户电量的问题,会让用户感觉良好,并因此欣赏你的App。

要想把苹果设备的(多核)性能发挥出来,并发编程是少不了的。如何创建和管理线程、如何对多线程进行优化、更重要的是如何写好线程安全的代码……本章介绍了一些原则性的建议,并给出了代码示例。当然,如何写好并发编程实际上是一个大课题,幸好图灵有一本《Objective-C高级编程: iOS与OS X多线程和内存管理》可以让我们深入的学习和了解iOS并发编程。 Objective-C高级编程


本书第三部涉猎的内容比较多方多面,第5章介绍应用的生命周期、第6章介绍用户界面,我们可以结合《iOS用户体验设计》来学习,充分发掘iOS功能,从而打造出高品质的移动应用。 iOS用户体验设计

第7章着眼于提高网络性能,我们可以结合《iOS网络编程与云端应用最佳实践》来学习和实践。 iOS网络编程与云端应用最佳实践

关于安全方面,图灵则有一本黑客攻防系列的《黑客攻防技术宝典:iOS实战篇黑客攻防技术宝典:iOS实战篇


第四部分名曰“代码之外”,自然不是教我们如何coding,而是涵盖了应用测试、工具,以及在自然环境下监控应用。如何利用好获得的数据及应用产生的埋点数据来跟踪性能并完善下一个发布版本对于快速迭代App来说非常重要。本部分着眼于测试、发布,介绍分析特定任务时所需要的特定的工具,以及埋点和数据分析。应该说市面上专门介绍这一部分(代码之外)的书并不多见。


关于iOS开发的书市面上是汗牛充栋,光图灵就出了几十本,不管是入门还是提高,照着书写个iOS App并不是难事,但是专门从提高App性能的角度出发,着眼于如何从编程的角度出发提高App的最终用户体验,本书是目前市面上独一无二的。