在我开始的一个新项目中,XCode决定每次运行它时都会编译项目中的每个文件,而不仅仅是编译更改的文件(以及依赖于这些文件的文件)。随着项目中越来越多的文件越来越多,这在时间和电池寿命方面都会成为越来越大的负担。
我可能在某处影响了这个设置;或者可能不是。我应该关注哪些项目设置?
答案 0 :(得分:7)
如果Xcode在您进行构建时重新编译大部分或全部源文件,通常意味着这些文件都直接或间接依赖于某些已更改的头文件。以下是一些需要注意的事项:
您的源文件是否倾向于#import
某些顶级头文件本身以递归方式导入一堆较低级别的头文件?如果修改了该依赖标头树中的任何文件,它将强制重新编译导入顶级标头文件的任何.m文件。您可以通过导入较低级别子模块的标头来减少这些依赖关系,或者更好的是,仅针对每个文件所需的特定标头。 (注意:某些未设计为以这种方式使用的库可能会使这种方法在某些情况下具有挑战性或不可能。)
某些第三方开发工具和静态库运行脚本,这些脚本在构建过程中生成或修改代码。如果源文件依赖于脚本生成的头文件,则每次脚本重新生成该头文件时都会重新编译它们。即使脚本生成的代码没有更改,如果头文件的上次修改日期发生更改,也会重新编译相关源文件。如果这是你的问题,可能需要一些聪明的黑客来消除冗余编译。
不要忘记检查预编译的头文件(.pch)以查看在那里导入的内容。在编译时,该文件的内容有效地注入项目中每个.m文件的顶部。
尝试通过将尽可能多的#import
语句从.h文件中移出到.m文件中来最小化依赖项。通常只需导入类的超类的头文件以及类在其.h文件中实现的任何协议即可。对于您在班级#import
中使用的任何其他类,数据类型或协议,您可以使用前向声明而不是@interface
语句。
答案 1 :(得分:7)
我意识到这个问题已经过了一个月了,但是在将一个旧项目移到Xcode 4时我遇到了类似的问题。经过多次研发后,我发现Xcode 4(在我的情况下为4.2)有一个bug,如果源文件的完整路径中有任何非ASCII字符,或者源文件包含的任何头文件的完整路径中,则每次构建时都会重新编译。这包括前缀头,在这种情况下,每次都会触发完整编译。在我的情况下,以前的程序员已经将“ƒ”附加到几个文件夹名称,一旦我删除它们,它就完美地工作了。
无论如何,在我(谷歌尝试)试图回答谷歌时,我偶然发现了这个问题,并认为我会分享我的解决方案。