xcode编译-优化策略

查看编译时间

关闭Xcode 终端输入

$ defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES

打开Xcode Cmd + B

这里写图片描述

代码层面优化

1.在Objective-C的项目中, @class通常放在.h文件中, 主要作用在于提升编译性能, 且能防止头文件的递归import.
编译性能的考虑
通常, 使用#import引入一个类的头文件, 编译时会将该类的头文件中的所有信息都引入, 包含属性和方法, 但有时候却不需要这么多, 且包含这些信息会降低编译性能.
而@class就表示这只是一个类而已, 我们所关心的仅此一点, 而不需要知道该类的内部有哪些属性和方法. 这种情况下, 我们在.h头文件中就可以仅仅使用@class, 以提升编译性能. 而在.m实现文件中, 往往就需要知道类的内部信息了, 这时就需使用#import来引入这些信息.

PS
若类文件依次使用#import来引用, 则最开始的头文件有变化, 则后续所有引用它的类都需要重新编译.
而@class则不会有这个问题.

import会导致递归引用
另外, 以#import的方式引入一个类, 有可能造成两个类之间相互引入对方的头文件, 造成递归引用. 这一点目前在xcode中不会再报错误了, 但依然是存在的.

include可能导致重复引入
import能够保证头文件只被引入一次, 而#include则可能会出现重复引入.

2.对常用的工具类进行打包(Framework/.a)
打包成Framework或者静态库,这样编译的时候这部分代码就不需要重新编译了。
3.常用头文件放到预编译文件里
XCode的pch文件是预编译文件,这里的内容在执行XCode build之前就已经被预编译,并且引入到每一个.m文件里了。

编译器选项优化

4.Debug模式下,不生成dsym文件
dysm文件里存储了调试信息,在Debug模式下,我们可以借助XCode和LLDB进行调试。所以,不需要生成额外的dsym文件来降低编译速度。
5.Debug开启Build Active Architecture Only
在XCode -> Build Settings -> Build Active Architecture Only 改为YES。这样做,可以只编译当前的版本,比如arm7/arm64等等,记得只开启Debug模式。这个选项在高版本的XCode中自动开启了。
6.Debug模式下,关闭编译器优化
编译器优化
Debug下关闭方式
在XCode -> Build Settings -> Apple LLVM 9.0 - Code Generation -> Optimization Level Debug
->None[-O0]
Release模式下,编译器也会自动优化一些代码,这样生成的程序性能是最优的。


PS
iOS编译
不管是OC还是Swift,都是采用Clang作为编译器前端,LLVM(Low level vritual machine)作为编译器后端。
编译器前端
编译器前端的任务是进行:语法分析,语义分析,生成中间代码(intermediate representation )。在这个过程中,会进行类型检查,如果发现错误或者警告会标注出来在哪一行。
编译器后端
编译器后端会进行机器无关的代码优化,生成机器语言,并且进行机器相关的代码优化。iOS的编译过程,后端的处理如下
1.LVVM优化器会进行BitCode的生成,链接期优化等等。
2.LLVM机器码生成器会针对不同的架构,比如arm64等生成不同的机器码。

Xcode build 编译.m文件时, 使用CompileC和clang命令。

CompileC ClassName.o ClassName.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler
export LANG=en_US.US-ASCII
export PATH="..."
clang -x objective-c -arch x86_64 -fmessage-length=0 -fobjc-arc... -Wno-missing-field-initializers ... -DDEBUG=1 ... -isysroot iPhoneSimulator10.1.sdk -fasm-blocks ... -I 上文提到的文件 -F 所需要的Framework  -iquote 所需要的Framework  ... -c ClassName.c -o ClassName.o
clang是实际的编译命令
-x      objective-c 指定了编译的语言
-arch   x86_64制定了编译的架构,类似还有arm7等
-fobjc-arc 一些列-f开头的,指定了采用arc等信息。这个也就是为什么你可以对单独的一个.m文件采用非ARC编程。
-Wno-missing-field-initializers 一系列以-W开头的,指的是编译的警告选项,通过这些你可以定制化编译选项
-DDEBUG=1 一些列-D开头的,指的是预编译宏,通过这些宏可以实现条件编译
-iPhoneSimulator10.1.sdk 制定了编译采用的iOS SDK版本
-I 把编译信息写入指定的辅助文件
-F 链接所需要的Framework
-c ClassName.c 编译文件
-o ClassName.o 编译产物

你可能感兴趣的:(Mac,iOS,Xcode)