为什么我们在xcode中的viewcontroller的实现和头文件中都有'@interface ViewController'行?
答案 0 :(得分:7)
这与@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
内的任何内容(除了通过@private
或@protected
定义的实例变量除外)都是公共的,并且内部的任何内容实现文件本质上是私有的。
答案 1 :(得分:2)
头文件中的一个定义了公共接口。
实现文件中的一个是类扩展,它使用任何私有实现细节扩展了公共接口。