objective-c – viewcontroller的实现和头文件中’@ interface ViewController’的原因

为什么我们在 xcode中的viewcontroller的实现和头文件中都有’@interface ViewController’行?

解决方法

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

这样做有几个原因.主要的是定义私有实例变量或属性.您不希望向导入头文件的所有人公开这些内容,但您需要一个存储内部信息的位置.例如,这将允许m_isActive仅在实现中使用:

@interface Class () {
    BOOL m_isActive;
}

您还可以覆盖头文件中声明的只读属性,以便在使用点表示法时实现文件具有对其的读写访问权限.例如:

标题

@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定义的实例变量除外)都是公共的,实现文件中的任何内容本质上都是私有的.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...