在Xcode6之前
,新建一个工程的时候,系统会自带
一个pch (precompile header)文件。在开发过程中,可以把那些在整个工程中,都广泛使用的头文件,包含在该文件下。编译器会自动将pch文件中的头文件,添加到所有的源文件中去。这样在需要使用相关类的时候不需要使用import就可以直接使用头文件中的内容,很大程度上带来了编程的便利性。但潜在的也带来了一些问题,这可能是Xcode6中默认不再创建pch的原因吧。(此观点摘自)
Xcode6之后,刚才说的那些美好都没有了~原因是什么呢?
我根据stackoverflow的一个观点,总结如下:
- 因为module,我们没有了
#import <Cocoa/Cocoa.h>
的需求 - 你在prefix header中写的代码是没有必要的。哪儿需要import,你就在那儿写。把你的定义写到他们所属的文件中去。把你的宏,哎,除非没有别的路,还是停止写宏吧。如果,哥们儿,你实在要写宏,那你就把它们放在一个头文件中引入。
- 只有当一个文件又大,而且几乎整个程序都要用(就像
Foundation.h
),我们才有必要用prefix header。但是矛盾来了,如果你有这么个文件,它又大又无处不在,你是不是该想想,你这是啥架构啊。 - 最重要的原因,prefix header导致代码很难重用,而且会导致一些莫名其妙的编译问题。
但是,在一些情形,如维护代码,或者利用以前的一些代码的时候,我们可能会用到prefix header,有没有解决方法呢?必须有啊!
只需两步!
-
1、在工程中新建一个.pch文件。
- 2、将它与编译设置关联。我对Clang不了解,但是在path中写的
$(SRCROOT)/BlockAndDelegatePassValueDemo/PrefixHeader.pch
,还是很好理解的。$(SRCROOT)
代表了工程的相对路径,你写完path,敲一下回车,path里就是绝对路径了
,然后紧跟后面的/BlockAndDelegatePassValueDemo
是相对工程名,最后是/PrefixHeader.pch
.pch的名。
最近又学习到一种更好的方式$(SRCROOT)/$(PROJECT_NAME)/PrefixHeader.pch
,其中$(PROJECT_NAME)
是相对工程名,比上面的方法更便捷.
编译一下,你就会发现,你所希望的美好又回来了!