使用下划线作为前缀命名实例变量是否会在Cocoa(Objective-C)中产生任何副作用?

Does naming an instance variable with underscore as a prefix have any side effects in Cocoa (Objective-C)?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How does an underscore in front of a variable in a cocoa objective-c class work?

我发现在Apple框架的头文件中,类接口内的apple name实例变量的前缀在作用域下。如下面的委托实例:

1
2
3
4
@interface ClassName : NSObject {
    id _delegate;
}
@end

但是,如果在定义自己的实例变量时遵循这个命名约定,会有什么副作用吗?我找这个问题的答案已经很久了。

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

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


老实说,我在一个非常大的项目中用下划线命名了所有的局部私有变量,事情开始看起来像这样。这个变量萨瓦_这是节省

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

我的理由是

  • 它使代码变丑,我讨厌丑陋的代码。
  • 它为您使用和引用的每个变量添加不必要的类型。
  • 它使自动完成有点无用,所以现在您必须键入""+变量名,Xcode自动完成才能更好地匹配您的变量。
  • 您已经可以在头文件中显式地将变量设置为私有和公共的,因此无需在所有变量的开头添加新的命名约定,例如"u"。
  • 我可能会用"uu"来表示一些非常私密的东西,我想表明这是特别的。但我绝不会使用它。

    希望这能解决问题。厕所。


    没有副作用。但是在访问私有的ivar和函数参数名时,使用下划线使代码的读取更加容易。

    例如,假设您的头文件中有NSString *_name;。那么在你的代码中应该是这样的:

    1
    2
    3
    4
    5
    - (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风格指南,并使用一个尾随下划线。所以我的IVARS应该是:NSString *name_;


    与john相反,我总是在局部变量前面加下划线,这是一个主要原因——它可以防止您意外地使用私有变量而不是公共变量。唯一应该访问私有变量的时间是init、dealoc和assessor方法。意外地使用一个私有变量会导致很难跟踪的错误和内存泄漏。