1

我正在为 iOS 开发第 3 方 UIKit 替代品。我使用来自 GitHub 的一个非常有用的项目将它构建为一个框架。(不是我的,但如果你有兴趣,它就在这里

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

当我#import在头文件中没有指令并声明 type 属性时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”。似乎都没有解决问题。我最终发现Target级别的设置会覆盖Project级别的设置,并且Target级别的设置已经指定了“ProjectName/ProjectName-Prefix.pch”。所以这是一个死胡同。(很高兴确切地了解相对路径设置是什么!)

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

4

1 回答 1

4

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

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

@class MyClass;

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

@protocol MyProtocol; //this won't work

@interface MyController : UIViewController <MyProtocol>

…
@end
于 2013-03-27T12:50:02.337 回答