2011-09-29 176 views
5

在我开始的一个新项目中,XCode决定每次运行项目时都会编译项目中的每个文件,而不仅仅是编译更改的文件(以及依赖于这些文件的文件)。随着项目中越来越多的文件越来越多,这将成为时间和电池寿命中越来越大的负担。XCode每次运行时编译整个项目

有可能是我改变了一个设置,影响了这一点;或者可能不是。我应该关注哪些项目设置?

+0

您是否曾经为此找到过解决方案? – ekeren

+0

@ekeren不,我没有。假设这是一个已经修复的Xcode中的错误。 – leecbaker

回答

7

如果Xcode在编译时重新编译大部分或全部源文件,那通常意味着这些文件全部直接或间接依赖于某个已更改的头文件。这里有一些事情要查找:

  1. 请对源文件会#import一些顶级头文件本身递归进口一堆较低级别的头文件?如果修改了从属头文件树中的任何文件,它将强制重新编译导入顶级头文件的任何.m文件。您可以通过为较低级别的子模块导入标头来减少这些依赖关系,或者更好的方法是仅为每个文件所需的特定标头。 (注意:某些不用于这种方式的库可能会使这种方法在某些情况下具有挑战性或不可能)。

  2. 某些第三方开发工具和静态库运行的脚本会生成或修改代码,作为他们的构建过程。如果源文件依赖于由脚本生成的头文件,则每次脚本重新生成头文件时都会重新编译它们。即使脚本生成的代码没有更改,如果头文件的最后修改日期发生更改,依赖的源文件也会重新编译。如果这是你的问题,可能需要一些聪明的黑客来消除冗余编译。

  3. 不要忘记检查您的预编译头文件(.pch)文件以查看导入的内容。在编译时,该文件的内容将有效地注入项目中每个.m文件的顶部。

  4. 尝试尽可能多地从.h文件中将尽可能多的#import语句移到.m文件中,从而尽量减少依赖关系。通常你只需要导入你的类的超类的头文件和你的类在.h文件中实现的任何协议。对于您在课程@interface中使用的任何其他类,数据类型或协议,您可以使用前向声明而不是#import语句。

+0

这些看起来都不是我遇到的问题 - 尽管如此,我将此标记为已接受的答案,因为我认为这可以使初学者能够找到该页面。 – leecbaker

7

我意识到这个问题是过了一个多月了,但我在移动旧项目的Xcode 4多毛认定书后也有类似的问题,我发现的Xcode 4(4.2在我的情况)有一个错误,如果源文件的完整路径或源文件包含的任何头文件的完整路径中有任何非ASCII字符,则每次构建时都会重新编译它。这包括前缀头文件,在这种情况下,每次都会触发完整的编译。就我而言,以前的程序员已将“ƒ”附加到多个文件夹名称,并且一旦我将其删除,它就可以很好地工作。

无论如何,我在(不成功)尝试谷歌的答案时偶然发现了这个问题,并认为我会分享我的解决方案。

+0

会很好,如果你添加了“Xcode的这个问题在Xcode xxx中修复了)。否则,读者必须想出一个耗时的设置来检查这是否有问题。我们现在在Xcode 7.2.1中, 提个醒。 –