6

为什么我们在 xcode 中的视图控制器的实现和头文件中都有“@interface ViewController”行?

4

2 回答 2

8

这与@interface. 当它包含在头文件中时,其他类在导入头文件时可以看到它。当它包含在实现文件中时,内容仅对该实现文件可用。通常,当它在实现文件中声明时,它是通过类扩展(即@interface ClassName ()()表示类扩展/匿名类别)完成的,尽管如果需要也可以使用命名类别。

这样做有几个原因。主要的是定义私有实例变量或属性。你不希望这些暴露给所有导入头文件的人,但你需要一个地方来存储内部信息。例如,这将m_isActive只允许在实现中使用:

@interface Class () {
    BOOL m_isActive;
}

您还可以覆盖头文件中声明的只读属性,以便实现文件readwrite在使用点表示法时可以访问它。例如:

标题:

@interface Class
@property (nonatomic, readonly) NSString* name;
@end

执行:

@interface Class ()
@property (nonatomic) NSString* name;
@end

@implementation Class
...
    self.name = @"WDUK"; // This is allowed, as the class extension has overridden the readonly attribute via a redeclaration of the property
...
@end

另一个流行的用途是私下声明您符合特定协议,这是一个实现细节,不需要在公共头文件中公开。例如,当实现使用一个需要它作为委托的对象时,并且您不想使用未在类外使用的协议污染头文件。

其他用途(随着最近的 LLVM/Clang 改进而被遗忘)是定义私有方法。这不再需要,因为编译器将查找未在相应头文件中声明的方法,并假定它们是类私有的并自行声明它们。

从这一切中得到的关键部分是,@interface头文件中的任何内容(通过@privateor定义的实例变量除外@protected)都是公共的,而实现文件中的任何内容本质上都是私有的。

于 2013-04-07T02:09:51.200 回答
2

头文件中的那个定义了公共接口。

实现文件中的一个是类扩展,它使用任何私有实现细节扩展公共接口。

于 2013-04-07T02:07:58.073 回答