高性能iOS应用开发

更多详情

内容简介: 性能对用户体验有着至关重要的影响。本书将介绍对用户体验产生负面影响的各个方面,并概述如何优化iOS应用的性能。全书共5个部分,主要从性能的衡量标准、对应用至关重要的核心优化点、iOS应用开发特有的性能优化技术以及性能的非代码方面,讲解了应用性能的优化问题。本书的主要目的是展示如何从工程学的角度编写优质代码。本书适合已经具有Objective-C和iOS实践经验的开发人员阅读。

目录: 译者序  xv
前言  xvii
第一部分  开始
第1章 移动应用的性能  3
1.1 定义性能  3
1.2 性能指标  4
1.2.1 内存  4
1.2.2 电量消耗  4
1.2.3 初始化时间  4
1.2.4 执行速度  5
1.2.5 响应速度  5
1.2.6 本地存储  5
1.2.7 互操作性  6
1.2.8 网络环境  7
1.2.9 带宽  7
1.2.10 数据刷新  8
1.2.11 多用户支持  8
1.2.12 单点登录  9
1.2.13 安全  9
1.2.14 崩溃  10
1.3  应用性能分析  10
1.3.1  采样  10
1.3.2  埋点  10
1.4  测量  11
1.4.1  设置工程与代码  11
1.4.2  设置崩溃报告  12
1.4.3  对应用埋点  13
1.4.4  日志  17
1.5  小结  19
第二部分 核心优化
第2章 内存管理  23
2.1  内存消耗  23
2.1.1  栈大小  24
2.1.2  堆大小  25
2.2  内存管理模型  27
2.3  自动释放对象  28
2.4  自动释放池块  30
2.5  自动引用计数  32
2.6  引用类型  35
2.6.1  变量限定符  36
2.6.2  属性限定符  37
2.7  实践环节  38
2.7.1  照片模型  38
2.7.2  更新故事板  38
2.7.3  方法实现  39
2.7.4  输出分析  41
2.8  僵尸对象  42
2.9  内存管理规则  43
2.10  循环引用  43
2.10.1  避免循环引用的规则  45
2.10.2  循环引用的常见场景  46
2.10.3  观察者  56
2.10.4  返回错误  59
2.11  弱类型:id  59
2.12  对象寿命与泄漏  61
2.13  单例  62
2.14  找到神秘的持有者  64
2.15  最佳实践  65
2.16  生产环境的内存使用情况  66
2.17  小结  67
第3章 能耗  68
3.1  CPU  68
3.2  网络  70
3.3  定位管理器和GPS  73
3.3.1  最佳的初始化  74
3.3.2  关闭无关紧要的特性  75
3.3.3  只在必要时使用网络  76
3.3.4  后台定位服务  77
3.3.5  NSTimer、NSThread 和定位服务  77
3.3.6  在应用关闭后重启  78
3.4  屏幕  78
3.4.1  动画  78
3.4.2  视频播放  78
3.4.3  多屏幕  79
3.5  其他硬件  83
3.6  电池电量与代码感知  83
3.7  分析电量使用  85
3.8  最佳实践  86
3.9  小结  88
第4章 并发编程  89
4.1  线程  89
4.2  线程开销  90
4.2.1  内核数据结构  90
4.2.2  栈空间  90
4.2.3  创建耗时  90
4.3  GCD  91
4.4  操作与队列  92
4.5  线程安全的代码  93
4.5.1  原子属性  93
4.5.2  同步块  94
4.5.3  锁  96
4.5.4  将读写锁应用于并发读写  100
4.5.5  使用不可变实体  102
4.5.6  使用集中的状态更新服务  106
4.5.7  状态观察者与通知  110
4.5.8  异步优于同步  114
4.6  小结  116
第三部分 iOS 性能
第5章 应用的生命周期  119
5.1  应用委托  119
5.2  应用启动  121
5.2.1  首次启动  123
5.2.2  冷启动  129
5.2.3  热启动  135
5.2.4  升级后启动  137
5.3  推送通知  138
5.3.1  远程通知  138
5.3.2  本地通知  141
5.4  后台拉取  142
5.5  小结  144
第6章 用户界面  145
6.1  视图控制器  146
6.1.1  视图加载  149
6.1.2  视图层级  150
6.1.3  视图可见性  152
6.2  视图  154
6.2.1  UILabel  155
6.2.2  UIButton  156
6.2.3  UIImageView  157
6.2.4  UITableView  158
6.2.5  UIWebView  161
6.2.6  自定义视图  164
6.3  自动布局  170
6.4  尺寸类别  171
6.5  iOS  8 中新的交互特性  175
6.5.1  交互式通知  175
6.5.2  应用扩展  176
6.6  小结  179
第7章 网络  180
7.1  指标和测量  180
7.1.1  DNS 查找时间  181
7.1.2  SSL 握手时间  182
7.1.3  网络类型  183
7.1.4  延迟  188
7.1.5  网络API  190
7.2  应用部署  190
7.2.1  服务器  191
7.2.2  请求  191
7.2.3  数据格式  192
7.3  工具  193
7.3.1  网络链接调节器  193
7.3.2  AT & T 应用资源优化器  194
7.3.3  Charles  196
7.4  小结  199
第8章 数据共享  200
8.1  深层链接  200
8.2  剪贴板  205
8.3  共享内容  208
8.3.1  文档交互  209
8.3.2  活动  215
8.4  iOS  8 扩展  217
8.4.1  配置操作扩展和共享扩展  219
8.4.2  操作扩展  220
8.4.3  共享扩展  221
8.4. 4 文档提供者扩展  223
8.4.5  应用群组  228
8.5  小结  230
第9章 安全  231
9.1  应用访问  232
9.1.1  匿名访问  232
9.1.2  认证访问  234
9.2  网络安全  237
9.2.1  使用HTTPS  237
9.2.2  使用证书锁定  238
9.3  本地存储  242
9.4  数据共享  248
9.5  安全和应用性能  248
9.6  清单  248
9.7  小结  250
第四部分 代码之外
第10章 测试及发布  253
10.1  测试类型  253
10.2  定义  254
10.3  单元测试  255
10.3.1  设置  255
10.3.2  编写单元测试  256
10.3.3  代码覆盖率  258
10.3.4  异步操作  262
10.3.5  Xcode  6 福利:性能单元测试  263
10.3.6  模拟依赖  265
10.3.7  其他框架  268
10.4  功能测试  268
10.4.1  设置  269
10.4.2  编写功能测试  271
10.4.3  工程结构  273
10.5  隔离依赖  274
10.6  测试及组件设计  275
10.7  持续集成与自动化  277
10.8  最佳实践  278
10.9  小结  282
第11章 工具  283
11.1  Accessibility Inspector  283
11.1.1  Xcode Accessibility Inspector  284
11.1.2  iOS Accessibility Inspector  285
11.2  Instruments  288
11.2.1  使用Instruments  289
11.2.2  活动监视器  291
11.2.3  内存分配  292
11.2.4  内存泄漏  295
11.2.5  网络  296
11.2.6  时间分析器  297
11.3  Xcode 视图调试器  298
11.4  PonyDebugger  300
11.5  Charles  304
11.6  小结  309
第12章 埋点与分析  310
12.1  词汇  310
12.2  埋点  312
12.2.1  规划  312
12.2.2  实现  314
12.2.3  部署  316
12.3  分析  317
12.4  真实用户监控  317
12.4.1  分析与真实用户监控对比  317
12.4.2  使用真实用户监控  318
12.5  小结  318
第五部分 iOS  9
第13章 iOS  9  321
13.1  应用的生命周期  321
13.1.1  通用链接  322
13.1.2  搜索  324
13.1.3  搜索最佳实践  328
13.2  用户界面  329
13.2.1  UIKit 框架  330
13.2.2  Safari 服务框架  332
13.3  扩展  335
13.3.1  内容拦截扩展  336
13.3.2  Spotlight 索引扩展  338
13.4  应用瘦身  339
13.4.1  分割  339
13.4.2  按需加载资源  340
13.4.3  bitcode  343
13.5  小结  344
第14章 iOS  10  345
14.1  Siri 扩展  346
14.2  改进的通知  348
14.2.1  申请权限  348
14.2.2  触发器  348
14.2.3  为通知添加交互  349
14.2.4  完全自定义展示通知  350
14.2.5  通知服务扩展  352
14.3  iMessage 扩展  354
14.4  VoIP 支持  357
作者介绍  359
封面介绍  359

译者序: 译者序
移动互联网经历了近五年的高速发展后,增长速度逐步趋于平缓。疯狂过后,逐渐回归理性。尽管红利不再,但其整体规模已经得到了极大的发展,手机和App已经成为了人们日常生活中很重要的一部分。在这个阶段,移动互联网的战争会变得更加惨烈。冷静下来的人们不禁会思考一个问题:如何让我们的App更有竞争力?
排除提供服务的能力差异(这通常与App本身无关),体验做到极致才更有机会捕获用户的芳心。如何把体验做得更好呢?一方面,“颜值”很重要,在这个“看脸”的年代,App的颜值太差一定会被用户嫌弃。另一方面,性能更重要,更高的性能意味着更短的等待时间、更平滑流畅的体验、更低的内存使用和更少的电量消耗。对于每个程序员来说,“我的App性能最好”,绝对是一件值得炫耀的事情。但要想真正做到这一点,却十分困难。
本人就职于美团大众点评的酒店旅游事业群,常年奋战在一线,专注于iOS App的开发和优化,在性能优化方面也积累了大量的实战经验。工作之余,一直有这样一种想法:如果有一本书能够系统地阐述iOS App性能优化的方方面面,一定会对我和我们的团队有巨大的帮助!第一次见到这本书,我就立即被它的内容吸引了。书中涵盖了iOS App性能优化的方方面面,既有广度,又有深度。书中介绍的知识点,可以非常容易地应用到实际的项目中;很多的技术点,和我们之前所做的优化简直是不谋而合,大有相见恨晚之感。本书凝聚了作者在性能优化方面付出的大量心血,值得每一位期望进阶的工程师深入地阅读和学习。能够接手本书的翻译任务,对我来说既兴奋又充满压力。尽可能快地把这样一部优秀作品的中文译本高质量地交付给读者,对我来说是件充满激情和挑战的事情。
为了做好本书的翻译工作,我们克服了许多困难。首先是时间,我们需要利用业余时间和尽可能多的碎片时间进行本书的翻译工作,经常深夜还看到小伙伴们仍然在奋笔疾书。不仅如此,我还有些许忧虑,担心自己把握不好原著恰到好处的笔锋,不能有效地将这样一部优秀的作品呈现在读者面前。因此,我们对这次翻译格外用心,与几位合作者一起查阅了大量相关资料,力求做到专业词汇准确权威,将原书的精华呈现给每一位读者。
现在,我怀着忐忑的心情,将此译著呈现给读者,渴望得到读者认可,更渴望与读者成为朋友。如果有任何问题和建议,请与我联系(liangshixing@gmail.com),让我们一起探讨,共同进步。
感谢北京图灵文化发展有限公司的编辑部主任朱巍女士,感谢你对我们的信任和支持。感谢编辑杨婷和谢婷婷,感谢你们提出的大量宝贵意见。感谢(美团大众点评)酒店旅游事业群负责人陈亮,感谢你建立了这支充满技术热情的移动团队。感谢另外两位译者,团队的同事郝田田和多年的好友陈作君,感谢大家几个月以来的共同努力。最后,还要感谢我的家人,他们给予我理解与包容。
梁士兴
2016 年11 月于北京

前言:
你可能已经开发过一个令人赞叹的iOS 应用,或者正在开发。如果应用整体运行良好但存在一些缺陷,那么用户可能不会给予五星好评,这些缺陷甚至会影响发布。
一些问题是用户可以直接发现的,例如,用户点击表格视图的某一项时出现抖动现象,应用的流量消耗过多或耗电量巨大。但是这些问题可能发生在更深的层面。
优化应用的性能是一项永无止境的工作,尤其在应用的新特性、操作系统版本、第三方库和设备配置层出不穷的情况下。而这些只是让开发者关注应用性能的一小部分内容。
一项研究表明,如果应用无法在三秒内加载启动,那么约四分之一的用户将弃用此应用, 约三分之一的用户会将这段令人不快的经历转告他人。
用户希望应用运行快速、响应迅速且不占用过量的资源。本书将介绍对用户体验产生负面影响的各个方面,并概述如何优化应用的性能。
本书读者
如果你写过iOS 应用并发布到了App Store,那么你的隐含目标是让应用更好、更快、更流畅,毫无疑问,你的最终目标是让应用为用户所喜爱。如果你正在寻找实现这个目标的方法,那么本书正是为你而准备的。
你应该已经具有Objective-C 和iOS 的实践经验。虽然在必要时为内容完整起见会介绍一些基本原理,但本书不会讨论如何使用Objective-C 或如何进行iOS 的入门开发。
本书撰写初衷
第一代iOS 和iPhone 1 于2007 年6 月推出。在早期版本中,开发人员忙于清理代码,为更多用户发布应用。随着硬件、操作系统、网络以及整体生态系统的不断提升,新的UI 和工程设计模式不断涌现,应用在功能、稳定性和性能方面逐渐成熟。
通常情况下,性能是后来才会考虑的事情。从某种程度上来说,我认同这种观点,毕竟最重要的是先完成功能,而不是担心性能。在软件开发周期的早期考虑性能通常被称为过早优化,但是,当糟糕的性能表现暴露时,问题就太严重了。
本书的主要目的是向读者展示如何从工程学的角度编写最优代码。
本书并非通过计算机理论科学、数据结构和算法来更快地执行程序。你可以找到很多关于这些主题的图书。本书涵盖了实现应用的最佳实践,即使在非理想条件(低存储空间、不良网络、低电量等)下,让用户仍然可以有效地使用应用,并乐于使用应用。通常而言, 你不可能优化所有的参数,但考虑有效因素可以实现最佳平衡。
本书预览
本书共由五个部分组成,每一个部分由一章或多章根据特定的主题组成。每章开头会有简短的摘要说明。
第一部分概述如何衡量性能。第1 章讨论可优化的方面,并概述跟踪应用性能时需要衡量的参数。
第二部分回顾对应用至关重要的核心优化点。第2 章讨论内存管理问题,其中描述了内存管理模型和对象引用类型,还讨论了影响内存消耗的设计模式的最佳实践,即单例和依赖注入。第3 章讨论电量及可以最大限度减少其消耗的技术。第4 章为并发编程概述,其中描述了各种有效方法,并提供了对比分析。
第三部分涉及iOS 应用开发特有的性能优化技术。第5 章深入探讨应用的生命周期,详细介绍了如何利用生命周期事件来确保资源的高效使用。第6 章专门阐述针对UI 的优化技术。第7 章和第8 章分别讨论网络和数据共享。第9 章深入探讨了应用的安全问题, 了解增强安全性会对应用的运行效率产生哪些负面影响,以及如何在两者间实现有效的平衡。
第四部分讨论性能的非代码方面。第10 章的内容涉及测试,特别是性能测试,此外还讨论了持续集成和测试自动化。第11 章概述开发过程中用于衡量性能的工具。第12 章讨论埋点和分析,以及如何从生产环境的应用中收集与性能相关的数据。
第五部分重点介绍iOS 9 及iOS 10。第13 章概述iOS 9 的变化,并从性能角度分析它们是如何影响你编写的代码的。第14 章概述了iOS 10 的变化。
本书提供了可运行的代码段。其中部分代码段可以原样使用,或只需要在应用中进行小修改。其他代码段可能需要进一步调整,以适应你自己的应用。
每章还提供了与该主题相关的一组最佳实践。在单一应用中可能无法始终遵循所有的最佳方案,可根据应用的具体要求对优化点进行取舍。
在线资源
本书涉及许多在线博客、文章、教程和其他参考资料,并在合适的地方提供了这些参考文献的链接。如果你发现有遗漏之处,请随时与出版社或作者联系。
本书还引用了几个应用的截图。应用的版权归其拥有者所有,本书使用屏幕截图仅用于教育和说明。
排版约定
本书使用了下列排版约定。
楷体
表示新术语或重点强调内容。
等宽字体(constant width)
表示程序片段,以及正文中出现的变量、函数名、数据库、数据类型、环境变量、语句和关键字等。
加粗等宽字体(constant width bold)
表示应该由用户输入的命令或其他文本。
等宽斜体(Constant width italic)
表示应该由用户输入的值或根据上下文确定的值替换的文本。
该图标表示提示或建议。
该图标表示一般注记。
该图标表示警告或警示。
使用代码示例
补充材料(代码示例、练习等)可以从https://github.com/gvaish/high-performance-ios-apps 下载。
本书是要帮你完成工作的。一般来说,如果本书提供了示例代码,你可以把它用在你的程序或文档中。除非你使用了很大一部分代码,否则无需联系我们获得许可。比如,用本书的几个代码片段写一个程序就无需获得许可,销售或分发O’Reilly 图书的示例光盘则需要获得许可;引用本书中的示例代码回答问题无需获得许可,将书中大量的代码放到你的产品文档中则需要获得许可。
我们很希望但并不强制要求你在引用本书内容时加上引用说明。引用说明一般包括书名、作者、出版社和ISBN。例如:“High Performance iOS Apps by Gaurav Vaish (O’Reilly). Copyright 2016 Gaurav Vaish, 978-1-491-91100-6.”
如果你觉得自己对示例代码的用法超出了上述许可的范围,欢迎你通过permissions@ oreilly.com 与我们联系。
Safari? Books Online
Safari Books Online(http://www.safaribooksonline.com) 是应运而生的数字图书馆。它同时以图书和视频的形式出版世界顶级技术和商务作家的专业作品。技术专家、软件开发人员、Web 设计师、商务人士和创意专家等,在开展调研、解决问题、学习和认证培训时,都将Safari Books Online 视作获取资料的首选渠道。
对于组织团体、政府机构和个人,Safari Books Online 提供各种产品组合和灵活的定价策略。用户可通过一个功能完备的数据库检索系统访问O’Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology 以及其他几十家出版社的上千种图书、培训视频和正式出版之前的书稿。要了解Safari Books Online 的更多信息,我们网上见。
联系我们
请把对本书的评价和问题发给出版社。
美国:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035)
奥莱利技术咨询(北京)有限公司
O’Reilly 的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示例代码以及其他信息。本书的网站地址是:
http://shop.oreilly.com/product/0636920034506.do
对于本书的评论和技术性问题,请发送电子邮件到:
bookquestions@oreilly.com
要了解更多O’Reilly 图书、培训课程、会议和新闻的信息,请访问以下网站:
http://www.oreilly.com
我们在Facebook 的地址如下:http://facebook.com/oreilly
请关注我们的Twitter 动态:http://twitter.com/oreillymedia
我们的YouTube 视频地址如下:http://www.youtube.com/oreillymedia
致谢
独立写一本书可能并不多见。
非常感谢雅虎的杰出架构师Daryl Low 与我密切合作,我们一起从头开始开发了货币化SDK。他为书中的部分章节提供了指导意见。与他一起通过应用原型测试性能极限并发现错误的根本原因一直是有趣和令人兴奋的工作。
感谢雅虎移动DevOps 工程负责人Walter Pezzini。他在我了解持续集成和交付流程时提供了关键见解,并帮助我了解构建高质量系统所需要的内容。
作者很容易假设读者已事先了解一些知识,但有时事实并非如此。非常感谢Chris Devers、Laura Savino 和Niklas Saers 的意见,他们让我明确需要澄清的领域。同样感谢他们提供反馈以帮助提高整体内容质量。
感谢我的妻子Renu Chandel,她不断鼓励我完成本书。如果不是因为她,本书也不会完成。还要感谢所有的咖啡!
最后,感谢O’Reilly Media 出版了本书。
本书的出版是大家共同努力的成果。谢谢大家。
电子书
扫描如下二维码,即可购买本书电子版。