需要帮助理解Xcode * .pch文件

时间:2013-03-27 12:43:39

标签: xcode compiler-construction import settings

我正在为iOS的第三方UIKit替代品工作。我使用GitHub的一个非常有用的项目构建它作为框架。 (不是我的,但如果你有兴趣,那就是here

我正在尝试在我写的其他项目中使用我的库。就像我说的那样,它基本上是UIKit大部分的替代品,所以我决定在我的项目的* .pch文件中导入框架,而不是在任何地方我可能希望使用按钮,操作表,警报视图等。

当我在头文件中没有#import指令并声明类型为MBMButton的属性时,编译器会给出错误“未知类型名称'MBMButton';你的意思是'的UIButton'?”奇怪的是,代码仍将运行(即使这是错误,而不是警告)。添加@class MBMButton#import <MBMUIKit/MBMUIKit.h>会解决此编译器投诉。

当我在实现文件(或其标题)中没有#import指令并调用MBMUIButton但不在UIButton中的方法时,我得到一个编译器错误“没有可见的@interface for'UIButton'声明选择器......”。和以前一样,代码实际上会运行,因为它是一个有效的调用。

现在,我已经做了一些挖掘,并且我已经改变了我的项目设置。我在GCC_PREFIX_HEADER中没有任何值,我添加了文件名。注意到Apple的快速帮助描述,我尝试了“ProjectName-Prefix.pch”和“./ProjectName-Prefix.pch”。似乎都没有解决问题。我最终发现目标级别设置会覆盖项目级别设置,而目标级别设置已经指定了“ProjectName /项目名 - Prefix.pch”。所以这是一个死胡同。 (很高兴知道相对路径设置到底是什么!)

我没有使用* .pch文件。这只是一个方便,我绝对可以使用适当的@class#import指令。困扰我的不是理解这个问题。 应该如何使用* .pch文件?

1 个答案:

答案 0 :(得分:4)

前缀头文件自动包含在项目的每个.m文件中,但不包含在任何.h文件中。

因此,对类的任何引用都需要包含标题或前向声明:

@class MyClass;

但是对于@protocol你需要完整的标题,前向声明将不起作用:

@protocol MyProtocol; //this won't work

@interface MyController : UIViewController <MyProtocol>

…
@end