Xcode技巧系列:http://www.jianshu.com/notebooks/7639304/latest
1 什么是编译方案
编译方案:一系列编译设置的集合,包括了构建项目时的编译配置,以及当启动项目时所使用的运行环境。
项目创建,系统会自动创建出一个编译方案,默认和项目名称相同,如下:
图中BLE就是系统自动创建的编译方案。
2 编辑管理编译方案
上图中,我们点击Manage Schemes...就可以进入管理界面,如图:
可以看到当前项目所有的编译方案,查看相关信息等。
2.1 创建新的方案
点击“+”号,出现创建表单:
填入创建方案所链接的对象Target和名称Name,即可创建。
编译方案需要和对象绑定一起,因此必须要选择要绑定的对象。
同时,也可以选择New Scheme...来创建。
2.2 方案排序,复制,导入、导出,删除
1.排序,直接在管理界面拖动即可
2.复制,选择要复制的方案,点击左下角齿轮,弹出菜单选择Duplicate,便会复制出方案
3.导入、导出,点击方案,点击齿轮,Export即为导出,Import导入
4.选中要删除的方案,点击“-”即可。
删除对象时,对应的方案并不会删除,需要手动删除!
2.3 方案管理
Container即为容器。一个项目的情况下,是默认的当前项目。如果包含多个项目的工作区,可以选择将方案关联到工作区或者其他项目。
Shared:方案共享开关。单人开发无需关心该功能。多人开发,如果不需要别人看到自己的编译方案,不勾选即可。
左上角Autocreate schemes复选框:表示创建对象时,是否自动创建编译方案,默认勾选。
右上角Autocreate Schemes Now:立即为当前对象创建默认的编译方案。
2.4 编辑方案
选择Edit Scheme即可进入编辑方案界面
1.左上角可以选择和切换需要编辑的方案。
2.底部有复制方案按钮。
3.管理方案按钮可以切换到管理界面。
4.可以开启共享。
5.左侧列表可以切换操作列表
2.4.1编译操作Build
编译操作是项目运行、分发前必须要做的,编译优先于其他所有操作。编译操作设置:
Parallelize Build:并行编译,允许Xcode并行编译多个独立的对象,即不依赖于其它对象可单独运行的对象。
Find Implicit Dependencies:允许Xcode自动寻找依赖,某些情况下,某个对象依赖于另一个对象才能运行时,Xcode可自动找出此类依赖。上述两个选项保持默认勾选即可。
下方列表列出了当前方案所要编译的全部对象。每个对象右侧有多个复选框,控制对应操作运行之前,是否要编译该目标。一般来说,都是需要编译的。
如果发现Xcode不能确定依赖关系,这时需要开发者自己通过“+”添加选择一个对象。如果对象编译顺序十分重要的话,需要取消并行编译选项。
2.4.2 运行操作Run
运行操作指定运行过程中需要的可执行文件、调试器、运行环境等选项。
1.info信息:如上图
Build Configuration:编译配置,选择运行时所使用的配置(debug调试,release发布),默认调试配置。
Executable:可执行文件,选择运行的可执行文件,也可以选择在运行时手动指定。如果改为没有包含在本方案中的对象,该对象会自动添加到编译方案中。没有可执行文件的对象的可以行文件设置是None。
Debug executable:调试可执行文件,指定是否对当前选定的可执行文件执行调试操作,如不执行,调试操作无作用。
Debug Process as:允许开发者以自身账号或者根用户的身份运行,如果开发者要调试某些需要权限才能运行的应用,则必须使用根用户。该选项只有MAC程序可以勾选。
Launch:启动,表示发起运行操作是自动执行可执行文件还是需要开发者自行启动。
2.Arguments参数:如上图
开发者可以控制启动参数和环境变量
Arguments Passed on Launch:启动时传递的参数,可以使用“+”添加启动时所需要传递的特定参数,这些参数一般情况下可以用在命令行程序上。
Environment Variables:环境变量,可以添加或覆盖当前应用环境中存在的环境变量。
Expand Variables Based ON:指定扩展Xcode所提供的变量时,要使用哪个可以行文件的特定环境变量。
3.Options选项
Core Location:定位模拟相关设置。allow location simulation:允许模拟器运行时模拟设备的地理位置。default location:定义模拟器启动时,首选的地理模拟位置,也可以往项目中添加GPX地理位置来自定义地理模拟位置。
Application Data:允许开发者从项目中事先将数据放置到应用程序中,需要application data package(应用程序数据包)的支持,如果当前工作区中不存在该数据包,则不可以进行数据预加载操作。
Routing App Coverage File:设置用于导航、交通相关的应用,开发者可以在项目中指定一个GeoJSON文件,详细说明应用所覆盖的地理区域。
GPU Frame Capture:为OpenGL之类的使用GPU的应用程序提供调试支持,Xcode可以捕获CPU绘制出来的每个帧画面,供开发者调试。其中:- Automatically Enabled:自动启用,Xcode根据应用代码推断是否提供此功能。也可以单独针对Metal、OpenGL ES框架来进行调试,或者关闭该调试功能。
- Metal调试开发者还可以选择是否开启Metal的API验证功能,让Xcode检测Metal的API是否能够实现预期的效果。
Background Fetch:后台获取,允许开发者启用后台获取功能,开启后,应用将不会在前台自动显示,会在后台根据相关代码进行后台数据获取操作。需要实现后台获取代码和开启Xcode的权限才能使用。
Localization Debugging:本地化调试,在调试过程中,选择是否输出未经本地化操作的字符串。
Application Language:应用程序语言,选择应用程序运行时所在的平台或者所在的环境的语言,通过该选项,可以模拟应用在不同的国家,不同的语言环境下所工作的情况,默认情况下使用系统语言和区域。
Application Region:应用程序区域,效果同上Application Language。
XPC Services:XPC服务,XPC是OS X处理多进程之间通信的服务,如果使用了该服务,则对其进行调试。
Queue Debugging:队列调试。
4.Diagnostics诊断选项卡
选项卡指定了一些用于测试和调试应用相关设置。
Runtime Sanitization:运行时处理。
- Address Sanitizer:检测一些内存方面的错误。
- Thread Sanitizer:检测多线程方面的错误。
- Pause on Issues:依次查看运行时的问题。
Memory Management:开启一些内存管理相关的服务,这些工具会在控制台调试区域输出:
- Malloc Scribble:内存涂抹,向分配的内存中填充0xAA,向已经销毁的内存中填入0x55。
- Malloc Guard Edges:边缘保护,分配大容量的内存前后添加保护。
- Guard Malloc:动态内存分配保护,使用libgmalloc来捕获常见的内存问题,比如缓冲区溢出。
- Zombie Objects:僵尸对象,僵尸对象表示已经被销毁的对象,开启后,如果向该对象发送消息,运行时便会输出错误,并可追踪到调用语句。
Logging:设置调试过程中,输出的日志包含的内容。
- Malloc Stack:动态内存分配栈,记录分配内存和释放内存时相关栈的信息。
- Dynamic Linker API Usage:记录动态链接相关API的调用信息。
- Dynamic Library Loads:库加载信息,记录动态链接相关API的调用信息。
2.4.3测试操作Test
指定当前方案使用的单元测试包,如图:
2.4.4剖析操作Profile
决定了我们使用剖析操作时,Xcode会执行何种命令。
2.4.5分析操作Analyze
对编译操作中指定的对象运行静态分析器。
2.4.6打包操作Archive
打包应用程序时进行的一些个性化设置。
2.5额外操作
点开操作旁边的三角形,会出现:
- Pre-actions:操作启用之前所完成的工作。
- Post-actions:操作启用之后所完成的工作。
选中其中一项,然后可以添加脚本或者添加一个发送邮件的操作。
我们添加一个编译完成后,发送邮件的动作和执行脚本的动作:
3 运行目标
指定应用在哪一个设备上运行。
还可以设置目标架构和SDK版本。通过Window->Devices进入设备管理界面:
很多朋友想添加老版本SDK的模拟器,可以通过下方添加按钮添加:
点开如果发现没有你想要的SDK版本,点开OS Version,选中下载更多版本即可进入如下界面:
下载你要的SDK版本即可。
如果是真机,显示的数据更模拟器比起来会有所不同。
真机可以通过View Device Logs查看真机保存的调试日志,Take Screenshot可以截取当前设备上的画面。