在Objective-C中用下划线加前缀变量名是什么意思?

时间:2010-10-03 21:51:58

标签: ios objective-c cocoa naming conventions

我注意到在许多社区Objective-C类和Apple的框架中,他们使用带有下划线的变量前缀的约定来命名一些变量,例如:_name。拥有下划线的原因是什么?我应该在自己的课堂上这样做吗?如果是的话我应该何时何地使用它?

3 个答案:

答案 0 :(得分:8)

这就是所谓的丑化。关键是你从不使用它,因此你创建的变量名称或#define都不会干扰Apple的代码。

具有讽刺意味的是,许多人使用这样的名称创建标题保护,因为他们看到系统标题是这样做的。

来自C99 7.1.3“保留标识符”:

  

所有以下划线开头且以大写字母或其他下划线开头的标识符始终保留供任何使用。

(它们意味着为系统库保留。)

注意:我不确定C99和Apple ObjC之间的确切关系,但您可能也有适用于整个C语言系列的命名约定。特别是ObjC ++需要有效的C ++名称,这些名称在任何地方都有额外的双重下划线要求。

答案 1 :(得分:4)

在Cocoa中,这是一个约定,表明某些东西是私有的,不应该在外部使用。然而,这是非官方的惯例,特别是考虑到the documentation中的这样的措辞:

  

以“_”开头的方法名称(单个下划线字符)保留供Apple使用。

但是,该建议特别适用于方法,而不是变量。因此,如果您希望使用下划线为变量添加前缀,请直接进行操作。话虽这么说,如果你使用下划线前缀来表示某些数据的私有性质,也许你不应该首先暴露它......

答案 2 :(得分:2)

下划线阻碍了可读性。同样用LLVM代替GCC,我摆脱了标题侧ivars并使用标题侧属性。除非你真的想要为线程安全同步读写,否则一定要使你的属性不是原子的。除非你指定非原子,否则它将默认为原子 - 这将剥夺你的一些性能。

也按惯例,永远不要用get启动访问器。 setters应该以set开头但没有get getter。阅读KVO和KVC,了解更多有关惯例及其有益的内容。

但我喜欢Enumeration命名列表中的下划线。这里的下划线帮助我挑选出5个或更多行的后缀,这些后缀都以相同的词干开头。 喜欢 typedef NSInteger COMPASS_DIRECTION; 枚举{  COMPASS_DIRECTION_NORTH,  COMPASS_DIRECTION_EAST,  COMPASS_DIRECTION_SOUTH,  COMPASS_DIRECTION_WEST, };