【问题标题】:Do you put #import s in .h or .m files?你将#import s 放在 .h 或 .m 文件中吗?
【发布时间】:2011-02-15 17:57:27
【问题描述】:

我想知道 Objective-C 风格。

我有 FooClass.[hm],它的实现依赖于 BarClass.[hm](尽管不是它的接口)。我可以直接在 FooClass.m 中或间接通过 FooClass.h #import "BarClass.h"。我想知道这个的常见选择。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    您应该始终 #import .m 文件中的其他类。

    如果他们碰巧也是您班级的成员,您可以在您的.h 文件中转发声明他们(通过使用@class 指令)。

    这样做的原因是因为当您#import 一个.h 文件时,您只想导入声明,而不是定义。通过在.m 文件中使用@class 和仅#importing,您可以a) 减少开销b) 使代码更简洁。

    Matt Gallagher 指出了您应该这样做的另一个原因:

    头文件中的前向声明背后的原因是它避免了不必要的依赖。即想象 B.h 前向声明 A 和 B.m 导入 A.h。然后想象 C.m、D.m、E.m 和 F.m 导入 B.h。完成这一切之后,A.h 发生了变化。由于 A 仅在 B.h 中前向声明,因此只有 B.m 需要重建。如果没有前向声明,如果 A 发生变化,C.m、D.m、E.m 和 F.m 都需要重新构建

    例子:

    .h文件:

    @class BarClass;
    
    @interface FooClass : NSObject
    
    ...
    
    @end
    

    .m文件

    #import "BarClass.h"
    
    @implementation FooClass
    
    ...
    
    @end
    

    【讨论】:

    • 感谢您的明确回答。我想知道您是否可以详细说明这个答案背后的原因。
    • 头文件中前向声明背后的原因是它避免了不必要的依赖。即想象 B.h 前向声明 A 和 B.m 导入 A.h。然后想象 C.m、D.m、E.m 和 F.m 导入 B.h。完成这一切之后,A.h 发生了变化。由于 A 仅在 B.h 中前向声明,因此只有 B.m 需要重建。如果没有前向声明,如果 A 发生变化,C.m、D.m、E.m 和 F.m 都需要重新构建。
    • @Matt,你说得对,我忘记了这一点。我会编辑它
    • 如果您使用委托作为类变量,您可能必须在头文件中使用#import 而不是@class。除此之外,这通常是个好建议。
    • @iter 不,这不仅仅是构建速度。它也与循环依赖有关。如果 A.h 导入 B.h 和 B.h 导入 A.h,由于其中一个或其他文件中未定义的引用,您会收到错误。
    【解决方案2】:
    • .h 文件 - 公共类的interface
    • .m 文件 - 类的私有 implementation

    我的规则是:

    • 转发声明[About] - @class inside .h 文件
    • 您应该减少.h 中的导入
    • 重音应该是在.m 文件中导入以防止依赖问题

    当您需要 implementation 中的某些内容时,您应该将其导入 .m。当您需要 interface 中的某些内容时,您应该将其导入 .h

    阅读import angle brackets <> and quote marks ""

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多