Xcode运行于苹果公司的Mac操作系统下,是苹果公司向开发人员提供的集成开发环境,主要用于开发Mac OS X和iOS应用程序。之前基本上只有Mac OS X应用的开发才会用到Xcode,所以它一直很小众,处于默默无闻的状态。随着移动设备的普及,移动应用的开发也越来越火热,iPhone占据了智能机市场的重要地位,越来越多的开发人员开始加入iPhone应用程序开发的阵营。从Xcode 3.1开始,它也可作为iOS的开发环境,所以Xcode也随之进入了移动开发人员的日常工作中。
本书深入浅出地介绍了Xcode 6的使用,作者根据自己丰富的Apple平台开发经验,通过3个示例程序,分别介绍了命令行开发、iPhone app开发和Mac app开发的最佳流程,在这些开发流程中,详细介绍了Xcode 6的各项功能。示例程序全部用最新的Swift语言编写。通过阅读本书,你可以掌握Xcode 6的使用方法和常见功能。熟练使用Xcode 6的各项功能可以极大地提高工作效率。
自从支持iOS开发后,Xcode的更新速度也加快了许多。每次都和iOS的新版本一起发布,翻译完本书的时候,苹果公司在WWDC 2015上刚刚发布了Xcode 7。Xcode 7最大的特性就是支持Swift 2.0和可以不用加入付费开发者计划就能在真机上调试,极大地方便了开发者。而且,苹果公司在WWDC上声称之后会将Swift开源,这将会极大地促进Swift社区的发展,本书中的示例程序都用Swift语言重新编写称得上是明智之举。书中介绍的各个特性基本都适用于Xcode 7,所以读者不必担心内容过时的问题。
本书内容翔实,循序渐进,覆盖了从项目初始到项目发布流程中涉及的Xcode功能,既可以作为经验丰富的开发人员的参考手册,也可以作为新手开发人员的入门指引书籍。
鉴于译者水平有限,书中难免有差强人意的地方,欢迎广大读者批评指正。
封面图
目录
- 译者序
- 前言
- 第一部分起步
- 第1章获取Xcode2
- 1.1开始之前2
- 1.2安装Xcode3
- 1.3移除Xcode4
- 1.4Apple开发者计划5
- 1.5下载Xcode6
- 1.6额外需要下载的内容7
- 1.7小结8
- 第2章初识Xcode9
- 2.1启动Xcode9
- 2.2Hello World11
- 2.2.1新建项目11
- 2.2.2让Xcode安静下来13
- 2.2.3构建和运行14
- 2.2.4货真价实的程序15
- 2.3删除项目15
- 2.4小结15
- 第3章简单的工作流程和被动调试16
- 3.1创建项目16
- 3.2构建19
- 3.3运行21
- 3.4简单调试22
- 3.5小结23
- 第4章主动调试24
- 4.1一个简单的测试用例24
- 4.2开始主动调试24
- 4.2.1设置断点25
- 4.2.2变量窗格26
- 4.2.3 单步调试27
- 4.3解决这个问题28
- 4.3.1行为28
- 4.3.2解决方法31
- 4.4小结31
- 第5章编译32
- 5.1编译32
- 5.2动态载入38
- 5.3Xcode和Clang38
- 5.3.1本地分析39
- 5.3.2跨函数分析41
- 5.3.3索引42
- 5.4Swift43
- 5.5编译产品47
- 5.5.1中间产品47
- 5.5.2预编译49
- 5.6小结51
- 第6章添加库target52
- 6.1添加target52
- 6.2target关系54
- 6.2.1添加文件到target中54
- 6.2.2target中的头文件56
- 6.3从属target56
- 6.3.1添加库57
- 6.3.2调试依赖target59
- 6.4小结59
- 第7章版本控制60
- 7.1采取控制61
- 7.2文件状态63
- 7.3首次提交65
- 7.4使用远程版本库66
- 7.4.1本地建立一个“远程”版本库68
- 7.4.2将文件推送到远程服务器69
- 7.5合并与冲突70
- 7.5.1User A70
- 7.5.2User B73
- 7.5.3返回User A75
- 7.6版本编辑器78
- 7.6.1Comparison78
- 7.6.2Blame80
- 7.6.3Log81
- 7.7分支81
- 7.8小结83
- 第二部分iOS应用程序的生命周期
- 第8章开始制作iOS应用程序86
- 8.1规划应用程序86
- 8.1.1模型–视图–控制器86
- 8.1.2模型87
- 8.1.3 视图87
- 8.1.4控制器88
- 8.2开始制作一个全新的iOS项目89
- 8.3项目中都包含什么91
- 8.4小结93
- 第9章iOS应用程序:模型94
- 9.1实现模型94
- 9.1.1实体95
- 9.1.2属性95
- 9.1.3关系97
- 9.2托管对象类100
- 9.2.1创建类——错误的方法100
- 9.2.2为什么按照Xcode的方式做是个错误102
- 9.2.3正确的方法——使用mogenerator102
- 9.3准备105
- 9.3.1Utilities105
- 9.3.2扩展类105
- 9.3.3passer_rating107
- 9.4定制Core Data类108
- 9.4.1在项目中添加Game数据108
- 9.4.2在项目中添加Passer数据109
- 9.4.3一些测试数据110
- 9.4.4源代码控制和产品文件112
- 9.5让模型更容易调试114
- 9.6小结115
- 第10章iOS应用程序:控制器116
- 10.1Objective-C中的符号重命名116
- 10.1.1重构Objective-C方法名117
- 10.1.2重构类名117
- 10.2在Swift中重命名类118
- 10.3编辑View Controller119
- 10.3.1表视图120
- 10.3.2构建Passer List121
- 10.3.3新建Passer121
- 10.4生命周期问题及处理方法122
- 10.5真正的Passer Rating123
- 10.5.1另外一个bug123
- 10.5.2运行Passer Rating127
- 10.6小结128
- 第11章构建新视图129
- 11.1下一个视图控制器129
- 11.1.1如果想要添加新视图控制器129
- 11.1.2storyboard、scene和segue130
- 11.2创建视图133
- 11.2.1Passing中的Outlet和Assistant134
- 11.2.2Billboard视图136
- 11.2.3链接视图与视图控制器137
- 11.2.4 特定场合下的自动布局138
- 11.2.5 各种标签140
- 11.2.6清理142
- 11.3表视图144
- 11.4outlet145
- 11.4.1连接outlet146
- 11.4.2检查连接147
- 11.4.3连接GameListController148
- 11.4.4代码补全和片段149
- 11.4.5代码片段150
- 11.5测试Billboard View152
- 11.6小结153
- 第12章新视图的自动布局154
- 12.1为什么选择自动布局154
- 12.1.1Autoresizing的局限155
- 12.1.2Auto Layout155
- 12.1.3需要牢记的问题155
- 12.2重新制作Player Billboard156
- 12.3重构子视图布局157
- 12.3.1Playground158
- 12.3.2StatView160
- 12.3.3安装StatView164
- 12.4设计约束165
- 12.5两行、两个标签167
- 12.6实际的约束169
- 12.6.1默认(Any/Any)170
- 12.6.2Any Height(非Compact)170
- 12.6.3Landscape(wAny/hCompact)171
- 12.6.4解决问题171
- 12.6.5细节修改171
- 12.7小结172
- 第13章添加表格单元格173
- 13.1Game表173
- 13.1.1Table View中的outlet173
- 13.1.2添加所需的Protocol方法174
- 13.1.3添加Model-to-View的支持175
- 13.1.4原型元素176
- 13.2Game Table:第一次运行177
- 13.3自定义表格单元格179
- 13.4添加一些图形182
- 13.4.1带有图片的单元格182
- 13.4.2将Image视图与图片联系在一起182
- 13.4.3 Assets目录183
- 13.4.4向Assets Catalog中添加图片184
- 13.4.5图标和启动图片186
- 13.5小结188
- 第14章添加编辑器189
- 14.1计划189
- 14.2添加模型场景189
- 14.2.1嵌入的View Controller191
- 14.2.2将Passer List与Editor相连193
- 14.2.3Static Table Cells194
- 14.3编辑器视图控制器195
- 14.3.1编辑器表195
- 14.3.2将数据传递给编辑器197
- 14.3.3从编辑器中获得数据198
- 14.4segue200
- 14.5小结201
- 第15章单元测试202
- 15.1Test Navigator203
- 15.2测试CSV Reader204
- 15.2.1CSV 测试代码205
- 15.2.2测试数据209
- 15.2.3运行测试程序210
- 15.3测试和调试器211
- 15.4添加测试类213
- 15.5异步测试216
- 15.5.1测试异步代码217
- 15.5.2文档217
- 15.6XCTest断言218
- 15.6.1简单测试218
- 15.6.2等价219
- 15.6.3异常219
- 15.7小结220
- 第16章度量和分析221
- 16.1速度221
- 16.1.1Debug 调试器222
- 16.1.2Instruments224
- 16.2XCTest和性能231
- 16.3内存232
- 16.4小结233
- 第17章iOS扩展234
- 17.1添加Today Target235
- 17.2设计挂件235
- 17.3框架内的共享库239
- 17.4Today扩展244
- 17.5构建依赖247
- 17.6结果248
- 17.7小结248
- 第18章配置249
- 18.1Apple开发者计划249
- 18.1.1通用(App Store)计划250
- 18.1.2企业计划250
- 18.2iOS的配置251
- 18.2.1你会看到什么251
- 18.2.2注册你的App253
- 18.2.3保护资源254
- 18.2.4提交iOS应用程序255
- 18.3 功能编辑器257
- 18.3.1OS X独有的功能257
- 18.3.2iOS和OS X中都有的功能257
- 18.3.3iOS功能258
- 18.4OS X沙箱259
- 18.4.1为什么要选择沙箱261
- 18.4.2 沙箱的缺点261
- 18.5Gatekeeper 和Developer ID262
- 18.5.1获取Developer ID262
- 18.5.2使用 Developer ID263
- 18.5.3限制264
- 18.6发布构建264
- 18.6.1基本的构建设置265
- 18.6.2调整构建设置265
- 18.6.3构建267
- 18.7小结268
- 第三部分Mac OSX开发中的Xcode
- 第19章开始制作OS X应用程序270
- 19.1目标270
- 19.2开始271
- 19.3模型274
- 19.3.1从iOS移植274
- 19.3.2添加实体275
- 19.4制作菜单278
- 19.4.1Target/Action279
- 19.4.2First Responder280
- 19.4.3将数据载入LeagueDocument281
- 19.4.4适应托管文档281
- 19.4.5测试命令283
- 19.4.6为League 数据确定一个类型284
- 19.4.7确定App如何处理League文件285
- 19.4.8应用程序和文档图标286
- 19.5小结 287
- 第20章绑定:连接OS X 应用程序288
- 20.1OS X中的Storyboard Segue288
- 20.2构建文档窗口290
- 20.2.1载入窗口290
- 20.2.2表视图291
- 20.3填充表——绑定294
- 20.3.1对象控制器294
- 20.3.2将表绑定到Team296
- 20.3.3将列绑定到Team属性297
- 20.4League文档数据的结构299
- 20.4.1从League表到Source List299
- 20.4.2捕获Team的选择301
- 20.4.3从Team到表303
- 20.4.4Passer部分304
- 20.5小结311
- 第21章本地化312
- 21.1本地化的工作原理312
- 21.2添加本地化313
- 21.2.1Base Localization313
- 21.2.2为什么需要 Base Localization314
- 21.3哪些需要本地化315
- 21.3.1游戏细节视图:布局315
- 21.3.2游戏细节视图:代码317
- 21.3.3模块和命名空间319
- 21.4法语本地化320
- 21.4.1添加语言环境320
- 21.4.2由简入繁:Credits.rtf323
- 21.4.3本地化Main.storyboard325
- 21.4.4本地化资源328
- 21.4.5本地化程序字符串329
- 21.4.6genstrings330
- 21.4.7xliff文件331
- 21.4.8其他332
- 21.5本地化系统字符串332
- 21.6小结334
- 第22章程序包335
- 22.1简单的包:RTFD335
- 22.2bundle336
- 22.3应用程序的bundle337
- 22.4Info.plist File338
- 22.5Info.plist中用于应用程序的键340
- 22.5.1用于iOS和OS X的键340
- 22.5.2OS X中使用的键342
- 22.5.3iOS中使用的键345
- 22.6小结347
- 第23章属性列表348
- 23.1属性列表数据类型348
- 23.2编辑属性列表350
- 23.2.1属性列表编辑器352
- 23.2.2为什么不使用属性列表编辑器356
- 23.3其他格式358
- 23.3.1文本属性列表358
- 23.3.2二进制属性列表359
- 23.3.3JSON360
- 23.4特殊的属性列表361
- 23.5小结362
- 第四部分Xcode任务集
- 第24章Xcode中的文档364
- 24.1Quick Help364
- 24.1.1Inspector364
- 24.1.2弹出窗口365
- 24.2快速打开366
- 24.3帮助367
- 24.4文档窗口368
- 24.4.1侧边导航栏368
- 24.4.2侧边栏的内容表368
- 24.4.3类信息368
- 24.4.4查找和导航369
- 24.5保持同步371
- 24.6自定义的Quick Help373
- 24.6.1C语言系列的文档373
- 24.6.2Doxygen375
- 24.6.3运行Doxygen380
- 24.6.4安装文档集合380
- 24.7Swift和reStructuredText381
- 24.8小结383
- 第25章Xcode构建系统384
- 25.1Xcode如何组织构建过程384
- 25.2构建变量387
- 25.3设置的层级388
- 25.4编辑构建变量389
- 25.5配置390
- 25.6配置文件392
- 25.6.1创建配置文件392
- 25.6.2SDK和指定的架构设置393
- 25.6.3预处理xcconfig文件393
- 25.7命令行工具394
- 25.7.1xcodebuild394
- 25.7.2xcode-select395
- 25.7.3xcrun396
- 25.8自定义构建规则397
- 25.9构建日志398
- 25.10简单的构建记录400
- 25.11小结408
- 第26章Instruments409
- 26.1Instruments是什么409
- 26.2运行Instruments410
- 26.3记录文档窗口411
- 26.3.1工具栏412
- 26.3.2记录区域414
- 26.3.3Detail区域415
- 26.3.4Extended Detail区域415
- 26.3.5库418
- 26.4追踪419
- 26.4.1记录419
- 26.4.2保存和重新打开422
- 26.4.3不启动instrument记录422
- 26.5Instruments422
- 26.5.1Behavior423
- 26.5.2Core Data423
- 26.5.3Dispatch423
- 26.5.4Filesystem423
- 26.5.5Graphics424
- 26.5.6Input/Output424
- 26.5.7Master Tracks424
- 26.5.8Memory425
- 26.5.9系统425
- 26.5.10System-iOS Energy Instruments427
- 26.5.11线程/锁427
- 26.5.12记录428
- 26.5.13UI Automation428
- 26.5.14用户界面428
- 26.6自定义Instruments429
- 26.7模板430
- 26.7.1全部平台430
- 26.7.2仅限iOS430
- 26.7.3仅限Mac431
- 26.8小结431
- 第27章调试432
- 27.1Scheme选项432
- 27.1.1Info432
- 27.1.2参数433
- 27.1.3选项433
- 27.1.4诊断435
- 27.2使用断点做更多的工作435
- 27.3视图层级437
- 27.4lldb命令行439
- 27.5小技巧441
- 27.6小结444
- 第28章零散的知识445
- 28.1技巧445
- 28.1.1一般技巧445
- 28.1.2代码折叠449
- 28.1.3Assistant编辑器450
- 28.1.4Instruments和调试452
- 28.1.5构建452
- 28.2陷阱454
- 第五部分附录
- 附录A一些构建变量460
- 附录B资源474