2010-10-03 54 views

回答

4

在Cocoa中,这是一个约定来表明某些东西是私人的,不应该在外部使用。然而,这是非官方的惯例,尤其是在这样的措词光the documentation

方法名称以“_”,单下划线,保留给苹果使用。

但是,该建议特别适用于方法,而不是变量。所以如果你想用下划线为你的变量加前缀,那就直接前进吧。这就是说,如果你使用下划线前缀来表示某些数据的私有性质,也许你不应该将它暴露在第一位...

8

这就是所谓的uglification。关键是你从来没有使用它,所以你创建的变量名或#define可能永远干扰苹果的代码。具有讽刺意味的是,很多人用这样的名字创建标题守卫,因为他们看到系统标题这样做。

从C99 7.1.3“保留的标识符”:

以下划线和一个大写字母或另一个下划线开头的所有标识符,始终保留用于任何用途。

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

注:我不知道的C99和苹果ObjC之间的确切关系,但你可能也有整个工作命名惯例C语言家族。特别是ObjC++需要有效的C++名称,这些名称在任何地方都有额外的要求,不需要双下划线。

+0

我不知道我明白,如果我正在编写自己的类,我应该如何uglify一些变量,我不打算在子类访问?或者这应该是一个苹果代码的东西? – 2010-10-03 21:59:22

+0

所以基本上它只是为了避免变量名称运行到彼此? – 2010-10-03 21:59:51

+0

@Alex:您可以选择自己的uglification语法,但是初始的下划线 - 大写和下划线 - 下划线(并且C++在名称中的任何位置也保留双下划线)是为系统保留的。这适用于所有平台;这是一种语言功能。 – Potatoswatter 2010-10-03 22:01:46

2

下划线妨碍了可读性。同样用LLVM代替GCC,我摆脱了header side ivars并使用header side属性。除非您确实希望读取和写入同步以确保线程安全,否则请确保您的属性不是原子的。除非你指定非原子,否则它将默认为原子 - 这会剥夺你的某些性能。

也按照惯例,从不使用get启动访问器。 setter应该从set开始,但不要get getters。阅读关于KVO和KVC的更多关于公约和它们的优点。

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

相关问题