Objective-C中的单个下划线显然是保留给Apple的“内部”使用的(并且在Apple声明之前可以与私有(private)实例变量一起使用)。但是,为什么他们在iPhone的SQLiteBooks示例中使用双下划线呢?请参阅摘自MasterViewController.m的此片段:
+ (EditingViewController *)editingViewController {
// Instantiate the editing view controller if necessary.
if (__editingViewController == nil) {
__editingViewController = [[EditingViewController alloc] initWithNibName:@"EditingView" bundle:nil];
}
return __editingViewController;
}
有人提到此forum与C有关的双下划线用法-用于“编译器的内部使用”。我想我看不出这种情况如何适用。
我的应用程序中需要一个ViewController,其行为与SQLiteBooks示例项目中的行为很相似,但是这个双重下划线使我感到困惑。
最佳答案
C编译器和Objective-C编译器都不会将带引号的下划线与任何其他变量名区别对待。单引号或双引号下划线只是一个约定,可以有效地形成一个 namespace ,就像 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)保留名称,该名称以两个下划线和一个大写字母开头,供编译器供应商使用,为它们提供保留的 namespace ,以用于用于实现标准库的全局变量和函数,或引入新的非标准关键字,例如
__block
。虽然SQLiteBooks代码在技术上是有效的,但在我看来,它很容易与保留的 namespace 混淆。如果确实要重用该代码,则建议重命名该变量(Xcode具有非常好的重命名重构功能,它将自动为您执行此操作)。