2013-03-27 136 views
1

我正在为iOS的第三方UIKit更换工作。我使用GitHub的一个非常有用的项目来构建它作为框架。 (不是我的,但如果你有兴趣,这是here需要帮助了解Xcode * .pch文件

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

当我在头文件中没有#import指令时文件并声明MBMButton类型的属性时,编译器会给我一个错误“Unknown type name'MBMButton';你的意思是'UIButton'吗?”奇怪的是,代码仍然会运行(尽管这是一个错误,不是warni ng)。添加@class MBMButton#import <MBMUIKit/MBMUIKit.h>可解决此编译器投诉。

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

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

我很好,没有使用* .pch文件。这只是一个方便,我可以肯定地使用适当的@class#import指令。什么是我的问题不是了解的问题。如何应该一个使用* .pch文件?

回答

4

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

因此,对类的任何引用都需要被包含在页眉或预先声明:

@class MyClass; 

然而,对于@protocol是你需要完整的头,向前声明将无法工作:

@protocol MyProtocol; //this won't work 

@interface MyController : UIViewController <MyProtocol> 

… 
@end 
+0

感谢您的快速回复。这种情况对于我的头文件中的错误是有意义的,但是为什么我的实现中会出现“No @interface ...”错误? – mbm29414 2013-03-27 13:04:22