Xcode躲藏装备

近期经过调试Xcode运行时的装备信息,挖掘出了需求Xcode躲藏装备。

PIFCache

在剖析Xcode DerivedData下的目录结构时能够了解到。PIFCache这个数据结构,它提供了一些优化手段,以加快编译速度。其中包括支撑多核心编译、削减无用代码编译、预编译头文件等优化方法。在较新的Xcode版别中Apple默认开启了IncrementalPIFTransfer能够提高一些工程的翻开速度。但是效果并不抱负,反而会导致大型工程下Clean和新增文件的情况下呈现卡顿问题。咱们能够封闭IncrementalPIFTransfer来削减新增文件时呈现的卡顿情况。

defaults write com.apple.dt.Xcode UseIncrementalPIFTransfer -bool NO

Xcode大局索引

通常在Xcode每次翻开工程时,Xcode需求完结以下使命。

  • 遍历一切的源码文件,核算是否需求生成索引。(首次进程十分绵长,或许会长达30秒以上才干看到目录树。)
  • 剖析依靠联系生成构建参数。
  • 后台进行Prebuild生成swiftmodule、framework等前置依靠,用于后续open、edit源码文件后快速进行语法剖析以及lint。(所需时刻与target数量成正比)
  • 后台生成大局索引,用于后续运用Refactor、Symbol Search、头文件高亮、代码跳转。(所需时刻与target数量成正比)

由此可见Xcode大局索引是一个很重的操作。那么有没有什么方法能够封闭大局索引,以及封闭后假如保证索引工程正常运用?

封闭Xcode大局索引

在上面挖掘出的Xcode躲藏装备中有一项装备是IDEIndexDisableBackgroundIndexing。依据字面意思能够剖分出这项装备能够单独封闭后台索引(即Xcode大局索引)。比较契合咱们的需求。

defaults write com.apple.dt.Xcode IDEIndexDisableBackgroundIndexing -bool YES

在Terminal中履行上述命令后并重启Xcode即可让装备收效。
那么接下来剖析下封闭Xcode大局索引带来了哪些问题。

封闭Xcode大局索引的长处

  • 每次启动越过遍历一切源码文件
  • 越过Prebuild以及Indexing

封闭Xcode大局索引的缺陷

高亮上色功率问题

封闭Xcode大局索引后上述使命部分直接不在履行,部分使命延迟到翻开文件时进行。
其中翻开文件时的大致流程如下:

  • 后台进行Prebuild生成swiftmodule、framework等前置依靠。完结Prebuild之后,对源码文件进行语法剖析以及lint。

由于以上流程的存在,能够预知翻开文件后或许需求先进行Prebuild再进行语法剖析。所以封闭开关后或许会呈现语法高亮、代码提示变慢的情况。

头文件高亮/跳转问题

由于Xcode进行语法剖析是经过clangswift对源码进行预编译来完结的。clang无法直接处理头文件,只能经过处理c/cpp/mm等文件是顺便处理头文件。所以假如没有完结大局索引会存在头文件无高亮的问题。处理方式也很简单,经过开启BuildWhileIndexing,在编译完结后再去检查头文件,即可处理头文件高亮/跳转的问题。

重构/符号查找问题

封闭Xcode大局索引,在Xcode消费DataStore中的索引数据时数据不完整。那么从数据库中检索出来的符号天然也不完结。处理方式一样是开启BuildWhileIndexing,在编译完结后即可运用重构/符号查找等才能。

Debug/Release/UnitTest/多Target缺少完整索引数据

封闭Xcode大局索引后生成完结的索引数据库强依靠BuildWhileIndexing特性,但是咱们通常不会编译一切Target。这样会导致不同编译装备和不同Target总是有一部分索引缺失。
所以当封闭大局索引时,对不参加编译的代码头文件或许会缺少高亮,运用重构、符号查找时或许信息也不完整。

分布式编译/编译缓存兼容性

本地假如开启了CCache编译缓存或分布式编译,或许会遇到一些兼容性问题。由于这些技能通常在编译一个文件时只会回来.o目标文件,编译进程中产生的索引文件留在了远程机器上。所以或许也会存在头文件无法高亮、重构、符号查找数据不完整的问题。