【问题标题】:Trouble with forward-declarations and header files前向声明和头文件的问题
【发布时间】:2013-01-07 17:43:43
【问题描述】:

为了缩短构建时间并尽可能保持代码简洁,我一直在头文件中使用前向声明并将#import 语句放在我的实现文件中。到目前为止,这一直很好,但是我遇到了一个问题。假设我有一个类MyClass,它返回一个类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 中。

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

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

【问题讨论】:

    标签: objective-c header-files forward-declaration


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你做的一切都是对的。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 2013-02-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多