Xcode编译相关
有时候Xcode编译很慢……
查看编译时间
Terminal 输入:
defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
ps:需重启Xcode
如下
po
打印出的对象为空
主target
有的时候在LLDB试用po
命令时可能会出现错误
error: warning: couldn’t get cmd pointer (xxx NULL): extracting data from value failed
Couldn’t materialize: couldn’t get the value of variable now: no location, value may have been optimized out
Errored out in Execute, couldn’t PrepareToExecuteJITExpression
原因是编译选项选择的是快速+优化。
相关内容是Xcode中Optimization Level的设置。
一共有七种选项:
- None[-O0]: 不优化。在这种设置下, 编译器的目标是降低编译消耗,保证调试时输出期望的结果。程序的语句之间是独立的:如果在程序的停在某一行的断点出,我们可以给任何变量赋新值抑或是将程序计数器指向方法中的任何一个语句,并且能得到一个和源码完全一致的运行结果。
- Fast[-O1]: 大函数所需的编译时间和内存消耗都会稍微增加。在这种设置下,编译器会尝试减小代码文件的大小,减少执行时间,但并不执行需要大量编译时间的优化。在苹果的编译器中,在优化过程中,严格别名,块重排和块间的调度都会被默认禁止掉。
- Faster[-O2]: 编译器执行所有不涉及时间空间交换的所有的支持的优化选项。在这种设置下,编译器不会进行循环展开、函数内联或寄存器重命名。和‘Fast[-O1]’项相比,此设置会增加编译时间和生成代码的性能。
- Fastest[-O3]: 在开启‘Fast[-O1]’项支持的所有优化项的同时,开启函数内联和寄存器重命名选项。这个设置有可能会导致二进制文件变大。
- Fastest, Smallest[-Os]: 优化大小。这个设置开启了‘Fast[-O1]’项中的所有不增加代码大小的优化选项,并会进一步的执行可以减小代码大小的优化。
- Fastest, Aggressive Optimizations[-Ofast]: 这个设置开启了“Fastest[-O3]”中的所有优化选项,同时也开启了可能会打破严格编译标准的积极优化,但并不会影响运行良好的代码。
- Smallest, Aggressive Size Optimizations [-Oz]: 与相似-Os,但会进一步减小代码大小,并且可能需要更长的时间才能运行。
那么想要详细信息就需要改为第一种。
pod里的Optimization Level
我们在使用pod的时候,每一个pod其实都是一个target,它有自己的Optimization Level。cocoapods默认给每一个pod的Optimization Level设置的是Fastest, Smallest,也就是说执行所有的优化和减少内存占用空间。
这样我们在开发的时候会有两个问题:一个是debug的时候无法输出pod源码里面的变量值,因为编译器已经给代码做了优化,它无法再记录你的变量值了。
把所有pod的的Optimization Level设置为None只需在Podfile里加入以下代码即可(其中的”Dev”为你项目的Scheme):
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
if config.name.include?("Dev")
config.build_settings['GCC_OPTIMIZATION_LEVEL'] = '0'
end
end
end
设置Xcode编译的线程数
defaults write xcodebuild PBXNumberOfParallelBuildSubtasks 8
defaults write xcodebuild IDEBuildOperationMaxNumberOfConcurrentCompileTasks 8
defaults write com.apple.xcode PBXNumberOfParallelBuildSubtasks 8
defaults write com.apple.xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 8
Xcode默认使用与CPU核数相同的线程来进行编译,但由于编译过程中的IO操作往往比CPU运算要多,因此适当的提升线程数可以在一定程度上加快编译速度。