为了保持我的编译时间,并使我的代码尽可能简洁,我一直在头文件中使用前向声明,并将我的#import
语句放入我的实现文件中。到目前为止,我一直工作得很好,但我遇到了一个问题。假设我有一个返回类对象的类,例如:
@interface MyClass : NSObject
-(Widget*)widgetWithName:(NSString*)name;
@end
假设
MyClass
有一个方法Widget
现在,假设我正在实现一个类,该类导入
Widget
,实例化一个-(void)arbitraryMethod;
对象,执行MyClass.h
,然后尝试将MyClass
消息发送到返回的widgetWithName:
,我得到错误arbitraryMethod
。所以,我必须导入Widget
头文件来修复错误。当然,当我返回
receiver type "Widget" for instance message is a forward declaration
类时,这不是问题,因为Widget.h
在Foundation
中。什么是最佳实践?我的直觉是,如果我返回一个类或在公共方法中将该类用作参数,则头文件应该包含在头文件中。否则,如果我有一个类,使用十个不同的非基础类在面向公众的方法,我的用户将不得不追捕和导入一个新的头文件到他们的项目每次他们想使用的方法。
这是正确的还是有更好的模式可以使用?
最佳答案
不能跳过在头中导入头,而不导入在返回类型中使用的类的头。在这种情况下,我假设您在@class Widget;
的标题中使用MyClass
。不能对其类型仅用@class
正向声明的对象调用方法,因为我记得bbum saying编译器没有必要的数据。您基本上没有告诉它类的任何内容,除了通过使用@class
来“它存在”之外,它通常只用于中断循环引用。我认为尽可能简单的做法是导入在实现中内部使用的类的头,但是,正如您所说,导入在头中的公共方法中用作返回和参数类型的任何类的头。