3

为了缩短构建时间并尽可能保持代码简洁,我一直在头文件中使用前向声明并将#import语句放在实现文件中。到目前为止,这一直很好,但是我遇到了一个问题。假设我有一个MyClass返回 class 对象的类Widget,例如:

@interface MyClass : NSObject
-(Widget*)widgetWithName:(NSString*)name;
@end

假设Widget有一个方法-(void)arbitraryMethod;

现在,假设我正在实现一个类,该类导入MyClass.h、实例化一个MyClass对象、执行widgetWithName:,然后尝试将arbitraryMethod消息发送到返回的Widget,我得到错误receiver type "Widget" for instance message is a forward declaration。所以,我必须继续导入Widget.h头文件来修复错误。

当然,当我返回Foundation课程时,这从来都不是问题,因为#import <Foundation/Foundation.h>Prefix.pch.

最佳做法是什么?我的直觉是,如果我要返回一个类或将该类用作公共方法中的参数,则头文件应该包含在我的头文件中。否则,如果我有一个类在面向公众的方法中使用了十个不同的非基础类,我的用户每次想要使用该方法时都必须寻找并将新的头文件导入到他们的项目中。

这是正确的还是有更好的模式可以使用?

4

2 回答 2

3

您不能跳过在您的标头中导入标头,直到您不为您在返回类型中使用的类导入标头。我假设你会在这种情况下使用@class Widget;in的标题。MyClass您不能在其类型仅向前声明的对象上调用方法,@class因为正如我记得bbum 所说,编译器没有必要的数据。除了通过使用“它存在”之外,您基本上没有告诉它该类的任何内容@class,它通常不仅仅用于破坏循环引用。我认为尽可能干净的是为您在实现中内部使用的类导入标头,但是,正如您所说,

于 2013-01-07T18:48:34.323 回答
0

你做的一切都是正确的。

MyClass.h是的,您需要Widget.h在其他类实现文件中都导入。您需要导入Widget.h,因为您实际上是在使用Widget 类——通过调用对象指针类型的方法Widget *。在实现文件中,您应该为实际使用的每个类导入标头;您永远不必关心什么标头MyClass.h导入或不导入(它应该尽可能少地导入,就像您所做的那样)。

于 2013-01-07T21:56:00.973 回答