在目标C的单下划线显然保留用于苹果公司的“内部”使用(并且是可用于与之前苹果的如权利要求私有实例变量使用)。但是,他们为什么会使用的的-underscore他们SQLiteBooks例如为iPhone?看到这个片段从MasterViewController.m采取:

+ (EditingViewController *)editingViewController {
    // Instantiate the editing view controller if necessary.
    if (__editingViewController == nil) {
        __editingViewController = [[EditingViewController alloc] initWithNibName:@"EditingView" bundle:nil];
    }
    return __editingViewController;
}

有双下划线使用提这个论坛,因为它涉及到C - 这是对“compier内部使用。”我想我怎么看不到这是适用于这种情况。

我需要一个视图控制器在我的应用程序,将表现很像一个在SQLiteBooks示例项目,但这个双下划线有我茫然不知所措。

有帮助吗?

解决方案

无论是C编译器,也不与前导下划线任何不同于任何其他变量名Objective-C的编译器将变量名。单或双前导下划线是一个简单的惯例和有效地形成一个命名空间,很像Cocoa类使用像NS。所述NSString前缀

综观SQLiteBooks代码,MasterViewController.m定义该静态全局变量:

// Manage the editing view controller from this class so it can be easily accessed from both the detail and add controllers.
static EditingViewController *__editingViewController = nil;

所以我的猜测是,SQLiteBooks的作者采用了双领先下划线来表示全局变量。

C编译器(并且通过扩展的Objective-C)储备名称以两个下划线和由编译器供应商使用大写字母,给他们一个保留的命名空间来使用用于实现标准库全局变量和函数,或至引入新的非标关键字,如__block

虽然SQLiteBooks码在技术上是有效的,它很容易在我看来保留的命名空间混淆。如果你重用代码,我建议重命名变量(Xcode中有一个非常好的重命名重构,它会自动为你做它)。

其他提示

要编译器,下划线像对待任何字母字符。更一般地,虽然,下划线,通常使用由语言扩展或大文库,以避免与用户代码的冲突。

使用下划线是有问题的,因为许多组的尝试预留每个名称以下划线的特定组合。

苹果历来使用单个下划线前缀表示一个私有实例变量(在面向对象的语言的一个常见样式)。这被认为暗示每个人都应该前缀他们的ivars用下划线,直到苹果公司指出,在代码中使用下划线可以创建与可可冲突,如果苹果决定改变自己的头,也许你不应该。因此,强调前缀已经变成了“不建议”的编码实践。

在C和C衍生物语言文字,和双下划线和前述任何以下字是一个非标准语言的扩展。见苹果的扩展名如__attribute __

尾随下划线通常加入作为原始名称的编译器或调试名称错位版本(特别是当编译器是多遍),并且通常避免使这些名称保持清楚地从原稿不同。谷歌后缀的Objective-C的本地实例变量使用下划线,以避免与苹果的下划线冲突。

我的建议是:不要使用下划线。你不应该使用局部变量具有相同的名称为实例变量(这只是混乱)。唯一潜在的冲突是setter方法的参数和相应的实例变量之间 - 你或许应该前缀以小写的“a”参数,“新”(或类似),因为这明确指出该参数是传入值但是尚未“的”值。

这只是一个变量命名约定。它没有的的东西。这是一种方式,程序编写者提醒自己,“这是一个私人的变量。”

这并不罕见编译器/库供应商来表示某些前/后缀作为他们“保留”。这主要是为了避免类型之间的任何不经意的冲突/定义/继承的变量。

你指的帖子是关于定义,不变量。许多编译器使用双下划线为它们提供与依赖于定义

至于为什么它的示例代码使用了这种风格 - 原作者所用的相同的编码风格,他有可能采用在他的日常工作和潜在的冲突从未强调

您应该罚款保留代码样品原样,但如果它让你不舒服然后可以重命名变量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top