0

可能重复:
可可objective-c 类中变量前面的下划线如何工作?

我发现在 Apple 框架的头文件中,Apple 名称实例变量在类接口内带有前缀下划线。像下面的 _delegate 实例:

@interface ClassName : NSObject {
    id _delegate;
}
@end

但是如果我们在定义我们自己的实例变量时遵循这个命名约定,会有任何副作用吗?我一直在寻找这个问题的答案很长一段时间。

在苹果的代码指南中,苹果只是说他们保留了以下划线开头的方法名称,他们没有提到对实例变量命名问题的任何限制。

我的同事说,如果您定义以下划线开头的实例变量,如果您选择的名称存在于框架的私有头文件中,则可能会与框架发生冲突。这是否可能,或者这是否成为我们不应该使用以下划线开头的名称的原因,因为苹果可能已经使用了它?

4

3 回答 3

3

没有副作用。但是在访问私有 ivars 和函数参数名称时,使用下划线可以更轻松地阅读代码。

例如,假设您NSString *_name;的头文件中有。然后在您的代码中将如下所示:

- (void)doSomethingWithName:(NSString *)name {
    // the underscore makes reading code easier
    _name = [name retain];
    name = [_name retain];  // you know right away that this is wrong
}

我个人遵循Google Objective-C Style Guide并使用尾随下划线。所以我的 ivars 将是:NSString *name_;

于 2011-04-11T11:52:04.083 回答
3

老实说,我在一个非常大的项目中用下划线命名了所有本地私有变量,事情开始看起来像这样。_thisVar _thatVar _thisSavesSomething

在我 10 年的编码和从事大小项目的工作中(我做过这个但没有做过这个)。不要这样做。这完全是浪费时间。(抱歉大喊大叫)。

我的理由是。

  1. 它使代码变得丑陋,我讨厌丑陋的代码。
  2. 它为您使用和引用的每个变量添加了不必要的输入。
  3. 它使自动完成有点没用,所以现在你必须输入“_”+变量名,然后 xcode 自动完成才能更好地匹配你的变量。
  4. 您已经可以在头文件中明确地将变量设为私有和公有,因此无需在所有变量的开头添加新的命名约定,例如“_”。

我可能会使用“_”来表示真正私密的东西,我想表明这是特别的。但我几乎永远不会使用它。

希望这可以解决问题。约翰。

于 2011-04-11T11:56:55.317 回答
-1

与 John 相反,我总是在我的局部变量前加上下划线,主要原因有一个 - 它可以防止您意外使用私有变量而不是公共变量。唯一应该访问私有变量的时间是在 init、dealloc 和评估器方法中。意外使用私有变量可能会导致难以追踪的错误和内存泄漏。

于 2011-04-11T13:37:16.050 回答