为什么在 Objective C 中变量名前要加下划线 "_"

15

点赞因为我认为我们应该熟悉各种标准命名约定。 - amod
3个回答

9

下划线通常用于表示变量是实例变量。这并不是必要的,因为ivars可以与其属性和访问器具有相同的名称。

示例:

@interface MyClass : NSObject {
    NSString *_myIVar;                  // can be omitted, see rest of text
}
// accessors, first one is getter, second one is setter
- (NSString *) myIVar;                  // can be omitted, see rest of text
- (void) setMyIVar: (NSString *) value; // can be omitted, see rest of text

// other methods

@property (nonatomic, copy) NSString *myIVar;

@end

现在,你不需要自己声明和编写访问器myIVarsetMyIVar:,可以让编译器来完成。在较新的版本中,你甚至不需要在接口中声明myIVar,只需声明属性,然后让编译器为你合成其余部分。在.m文件中,你只需这样做:
@implementation MyClass
@synthesize myIVar; // generates methods myIVar and setMyIVar: for you, 
                    // with proper code.
                    // also generates the instance variable myIVar

// etc...

@end

确保最终化字符串:

- (void) dealloc {
    [myIVar release]; 
    [super dealloc];
}

如果您想要实现更多的getter或setter功能,可以自己编写其中一个或两个,但是这样您也需要注意内存管理。在这种情况下,编译器将不再生成特定的访问器(但如果只有一个手动完成,则另一个仍将生成)。

您可以通过以下方式访问属性:

myString = self.myIVar;

或者,来自另一个类:
theString = otherClass.myIVar;

并且

otherClass.myIVar = @"Hello, world!";

在MyClass中,如果省略self.,则会得到裸的ivar。这通常只应在初始化程序和dealloc中使用。

谢谢你的清晰解释并接受我的问题,因为你的例子正是我所遇到的情况。 - Java Ka Baby

8

不要这样做。

单个下划线开头是苹果公司的一种内部编码规范。他们这么做是为了防止他们的实例变量名与你的变量名发生冲突。如果你想在实例变量名上使用前缀,请使用除了单个下划线之外的任何字符。


我认为有些人也使用它来避免意外地使用原始 ivars 而不是访问器? - andyvn22
__variable(两个下划线)是否意味着特别危险的内部变量?我知道有内部方法的约定,但在深入研究苹果库之前,我从未见过这些方法。 - Allison
two underscore is fine. - Will Gwo

1

这是一种通常用于C++中定义私有实例变量的命名约定。

就像在一个类中,你可能会有:

private:
int __x;

public:
int GetX()
{
  return this.__x;
}

这是一个命名约定,我在C++中被迫使用。然而,我的老师从未告诉我们这个命名约定的名称。但我觉得这很有用且易于阅读,特别是当您不使用Java命名约定时。


谢谢您的详细解释,加一。 - Java Ka Baby
Java和Objective-C是两种不同的编程语言。不要以为你能用Java做到的事情就一定要用Objective-C来做。 - SevenBits
@SevenBits 我猜你没有仔细阅读我的回答。我已经提到它们通常会使您的变量可读性更好。其次,Java开发人员通常遵循驼峰命名法来实现可读性。请在下投票之前仔细阅读答案。 - amod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接