第1章 引言 1
1.1 我为什么要写本书 1
1.1.1 我的构思 1
1.1.2 内容导读 1
1.1.3 目标读者 2
1.1.4 随书示例代码和勘误 2
1.1.5 致谢 2
1.2 如何提高iOS开发技能 3
1.2.1 阅读博客 3
1.2.2 读书 3
1.2.3 看WWDC视频 4
1.2.4 看苹果的官方文档 4
1.2.5 看开源项目的代码 4
1.2.6 多写代码,多思考 4
1.2.7 多和同行交流 5
1.2.8 分享 5
第一部分:iOS开发工具 9
第2章 使用CocoaPods做依赖管理 9
2.1 CocoaPods简介 9
2.2 CocoaPods的安装和使用 10
2.2.1 CocoaPods的安装 10
2.2.2 使用CocoaPods的镜像索引 10
2.2.3 使用CocoaPods 11
2.2.4 查找第三方库 11
2.3 注意事项 12
2.3.1 关于.gitignore 12
2.3.2 为自己的项目创建podspec文件 12
2.3.3 使用私有的pods 12
2.3.4 不更新podspec 12
2.3.5 生成第三方库的帮助文档 13
2.3.6 原理 13
第3章 网络封包分析工具Charles 15
3.1 Charles简介 15
3.2 Charles的安装和使用 16
3.2.1 安装Charles 16
3.2.2 安装SSL证书 16
3.2.3 将Charles设置成系统代理 17
3.2.4 Charles主界面介绍 18
3.2.5 过滤网络请求 18
3.3 使用Charles协助iOS开发 19
3.3.1 截取iPhone上的网络封包 19
3.3.2 模拟慢速网络 21
3.4 高级功能 22
3.4.1 截取SSL信息 22
3.4.2 修改网络请求内容 23
3.4.3 修改服务器返回内容 25
3.5 Map功能 25
3.6 Rewrite功能 27
3.7 Breakpoints功能 29
3.8 总结 30
3.9 参考链接 30
第4章 界面调试工具Reveal 31
4.1 Reveal简介 31
4.2 Reveal的使用 32
4.2.1 用Reveal连接模拟器调试 32
4.2.2 用Reveal连接真机调试 34
4.2.3 用Reveal调试其他应用界面 34
4.2.4 总结 35
4.2.5 参考资料 36
第5章 移动统计工具Flurry 37
5.1 Flurry简介 37
5.2 Flurry的基本使用 38
5.2.1 注册和下载对应SDK 38
5.2.2 集成SDK 40
5.2.3 自定义统计项 42
5.2.4 查看统计结果 43
5.2.5 统计Crashlog 44
5.3 对比和总结 45
5.3.1 和其他统计分析平台的对比 45
5.3.2 总结 45
第6章 崩溃日志记录工具Crashlytics 47
6.1 Crashlytics简介 47
6.2 Crashlytics的使用 49
6.3 实现原理和使用体会 52
第7章 App Store统计工具App Annie 55
7.1 App Annie简介 55
7.2 App Annie的使用 56
7.3 App Annie账号的注册及配置 59
7.4 和其他工具的对比 60
7.4.1 官方的命令行工具 60
7.4.2 其他类似服务 61
7.4.3 功能对比 61
第8章 Xcode插件 63
8.1 Xcode插件管理工具Alcatraz 63
8.1.1 简介 63
8.1.2 安装和删除 64
8.1.3 使用 64
8.1.4 插件路径 66
8.2 关于Xcode的插件机制 66
8.3 常用Xcode插件 66
8.3.1 KSImageNamed 66
8.3.2 XVim 67
8.3.3 FuzzyAutocompletePlugin 67
8.3.4 XToDo 67
8.3.5 BBUDebuggerTuckAway 68
8.3.6 SCXcodeSwitchExpander 68
8.3.7 deriveddata-exterminator 68
8.3.8 VVDocumenter 69
8.3.9 ClangFormat 69
8.3.10 ColorSense 69
8.3.11 XcodeBoost 70
第9章 其他工具介绍 71
9.1 取色工具:数码测色计(DigitalColor Meter) 71
9.1.1 前言 71
9.1.2 使用介绍 71
9.1.3 其他类似工具:xScope 72
9.2 其他图形工具 73
9.2.1 ImageOptim 73
9.2.2 马克鳗 74
9.2.3 Dash 74
9.2.4 蒲公英 75
9.3 命令行工具 75
9.3.1 nomad 75
9.3.2 xctool 76
9.3.3 appledoc 76
第二部分:iOS开发实践 81
第10章 理解内存管理 81
10.1 引用计数 81
10.1.1 什么是引用计数,原理是什么 81
10.1.2 我们为什么需要引用计数 83
10.1.3 不要向已经释放的对象发送消息 85
10.1.4 循环引用(reference cycles)问题 85
10.1.5 使用Xcode检测循环引用 88
10.2 使用ARC 90
10.2.1 Automatic Reference Count 90
10.2.2 Core Foundation对象的内存管理 92
第11章 掌握GCD 95
11.1 GCD简介 95
11.2 使用GCD 97
11.2.1 block的定义 97
11.2.2 系统提供的dispatch方法 98
11.2.3 修改block之外的变量 99
11.2.4 后台运行 99
11.2.5 总结 100
第12章 使用UIWindow 101
12.1 UIWindow简介 101
12.2 为UIWindow增加UIView 102
12.3 系统对UIWindow的使用 102
12.3.1 WindowLevel 104
12.3.2 手工创建UIWindow 105
12.3.3 不要滥用UIWindow 108
12.3.4 参考资料 109
第13章 动态下载系统提供的多种中文字体 111
13.1 功能简介 111
13.1.1 前言 111
13.1.2 功能介绍 112
13.1.3 字体列表 112
13.2 使用教程 113
13.2.1 相关API介绍 113
13.2.2 总结 115
第14章 使用应用内支付 117
14.1 后台设置 117
14.2 iOS端开发 119
14.3 服务端开发 121
14.4 注意事项 122
第15章 基于UIWebView的混合编程 123
15.1 混合编程简介 123
15.2 使用模板引擎渲染HTML界面 124
15.3 Objective-C语言和JavaScript语言相互调用 126
15.4 如何传递参数 129
15.5 同步和异步 129
15.6 注意事项 130
15.6.1 线程阻塞问题 130
15.6.2 主线程的问题 130
15.6.3 键盘控制 130
15.6.4 CommonJS规范 130
15.7 使用Safari进行调试 131
第16章 安全性问题 135
16.1 前言 135
16.2 网络安全 135
16.2.1 安全地传输用户密码 135
16.2.2 防止通讯协议被轻易破解 137
16.2.3 验证应用内支付的凭证 138
16.3 本地文件和数据安全 138
16.3.1 程序文件的安全 138
16.3.2 本地数据安全 140
16.4 源代码安全 140
16.5 总结 142
第17章 基于CoreText的排版引擎 143
17.1 CoreText简介 143
17.2 基于CoreText的基础排版引擎 145
第18章 实战技巧 181
18.1 App Store与审核 181
18.1.1 撤销正在审核的应用 181
18.1.2 申请加急审核 181
18.1.3 应用在市场的名字 182
18.1.4 测试设备数的限制 182
18.1.5 如何将应用下架 183
18.1.6 如何举报别的应用侵权 183
18.1.7 iTunes Connect后台操作出错 184
18.1.8 Metadata Reject 184
18.2 开发技巧 184
18.2.1 UILabel内容模糊 184
18.2.2 收起键盘 184
18.2.3 NSJSONSerialization比NSKeyedArchiver更好 185
18.2.4 设置应用内的系统控件语言 185
18.2.5 为什么viewDidUnload被废弃 188
18.2.6 多人协作慎用Storyboard 189
18.2.7 避免滥用block 190
18.2.8 合并工程文件的冲突 192
18.2.9 忽略编译警告 193
18.3 Xcode使用技巧 193
18.3.1 Xcode快捷键 193
18.3.2 查找技巧 195
18.3.3 JavaScript文件设置调整 195
18.3.4 清除DerivedData 196
18.3.5 target信息异常 197
18.3.6 下载Xcode 197
18.4 调试技巧 197
18.4.1 模拟器快捷键 197
18.4.2 覆盖安装注意事项 197
18.4.3 给模拟器相册增加图片 198
18.4.4 获得模拟器中的程序数据 198
18.4.5 安装旧版本的模拟器 199
18.4.6 模拟慢速网络 199
18.4.7 异常断点与符号断点 199
18.5 ipa文件格式 199
18.5.1 查看ipa的内容 199
18.5.2 查看ipa中的图片 200
18.6 为工程增加Daily Build 201
18.6.1 前言 201
18.6.2 步骤 201
18.6.3 遇到的问题 206
18.6.4 总结 206
18.7 使用脚本提高开发效率 206
18.7.1 删除未使用的图片资源 206
18.7.2 用脚本自动生成小尺寸的图片 207
18.7.3 检查图片 208
18.8 管理代码片段 209
18.8.1 代码片段介绍 209
18.8.2 定义自己的代码片段 210
18.8.3 使用Git管理代码片段 211
18.8.4 其他代码片段管理工具 211
第三部分:iOS开发底层原理 215
第19章 Objective-C对象模型 215
19.1 简介 215
19.2 isa指针 215
19.3 类的成员变量 217
19.4 对象模型的应用 220
19.4.1 动态创建对象 220
19.4.2 系统相关API及应用 222
19.4.3 参考文献 226
第20章 Tagged Pointer对象 227
20.1 原有系统的问题 227
20.2 Tagged Pointer介绍 228
20.2.1 Tagged Pointer 228
20.2.2 特点 230
20.3 注意事项和实现细节 231
20.3.1 isa指针 231
20.3.2 64位下的isa指针优化 231
20.3.3 isa的 bit位含义 232
20.3.4 总结 233
20.3.5 参考文献 233
第21章 block对象模型 235
21.1 block的内部数据结构定义 235
21.2 用clang分析block实现 237
21.2.1 NSConcreteMallocBlock类型的block的实现 242
21.2.2 变量的复制 243
21.3 注意事项 243
21.3.1 避免循环引用 243
21.3.2 ARC对block类型的影响 244