【发布时间】:2011-02-15 17:57:27
【问题描述】:
我想知道 Objective-C 风格。
我有 FooClass.[hm],它的实现依赖于 BarClass.[hm](尽管不是它的接口)。我可以直接在 FooClass.m 中或间接通过 FooClass.h #import "BarClass.h"。我想知道这个的常见选择。
【问题讨论】:
标签: objective-c
我想知道 Objective-C 风格。
我有 FooClass.[hm],它的实现依赖于 BarClass.[hm](尽管不是它的接口)。我可以直接在 FooClass.m 中或间接通过 FooClass.h #import "BarClass.h"。我想知道这个的常见选择。
【问题讨论】:
标签: objective-c
您应该始终 #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
【讨论】:
#import 而不是@class。除此之外,这通常是个好建议。
.h 文件 - 公共类的interface
.m 文件 - 类的私有 implementation
我的规则是:
@class inside .h 文件.h 中的导入
.m 文件中导入以防止依赖问题当您需要 implementation 中的某些内容时,您应该将其导入 .m。当您需要 interface 中的某些内容时,您应该将其导入 .h。
【讨论】: