XCode模板中的ivars以一个或两个下划线作为前缀

有人知道为什么在XCode模板中(至less在XCode 4.3.2中)有一些带有两个下划线的ivars和一个只有一个的前缀?

例如,Master-Detail应用程序模板包含文件MasterViewController.m,您可以在其中find:

@synthesize detailViewController = _detailViewController; @synthesize fetchedResultsController = __fetchedResultsController; @synthesize managedObjectContext = __managedObjectContext; 

谢谢。

这是一小撮蠕虫。

下划线在@synthesize中使用,主要用于区分实例variables和访问器名称。 这很重要,特别是如果你不仅仅访问你的访问器中的variables(例如,懒惰初始化)。 如果它们是相同的名称,那么在调用accessor方法的意思是“self.foo”时,可以轻松地键入“foo”并获取实例variables。 所以,这就是为什么在这种情况下使用下划线。

现在,苹果已经表示,我们不应该在私有方法名称中使用前导下划线。 他们使用该惯例为他们的私有方法名称,并且您可能无意中重写其中一个基类方法。 这将是不好的,特别是因为你不能在编译的时候看到这个。

但是,他们表示可以使用私人实例variables的下划线。 事实上,他们说,在综合属性中使用ivars的下划线是完全正确的(并且build议)。

现在,这是抓住。 他们还使用一个前导下划线来表示私有实例variables。 所以,如果你有相同的名字,你可能会有冲突。 为了看到这一点,在实现一个视图控制器方法,他们'_',看看什么代码完成抛出你的方式。

那么,为什么他们不打消这种命名的习惯呢? 因为冲突在编译时被捕获。 你不能有两个同名的实例variables。 如果你尝试这样做,你会得到一个错误。

现在,为什么他们的代码模板生成带有双下划线的名字? 我不知道。 “实现”实际上保留了前两个下划线(后跟大写字母),但我们看到ObjC添加如__block。

为了我的钱,我避免任何带有双下划线的东西。 苹果可以在他们生成的代码中做任何他们想做的事 FWIW,他们为ARC生成的一些代码仍然引用旧的非ARC关键字,所以我不会把他们生成的代码作为福音。 FWIW,我当然不会保留他们为核心数据生成的代码。 至less,你应该改变(在managedObjectContext访问器方法):

 __managedObjectContext = [[NSManagedObjectContext alloc] init]; 

 __managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 

顺便说一下,我曾经看到人们使用美元符号作为主要或尾随字符作为其私有的综合名称。

 @synthesize foo = $foo; @synthesize bar = bar$; 

我已经写了超过25年的C / C ++,但是对于ObjC来说我还是比较新的,它有其自己的错综复杂。 所以,我不是一个语言律师。 我甚至不是律师助理。 我所知道的是,这似乎是合法的 – 它对我所尝试过的每一件事都有效,尽pipe我不能肯定地说美元符号不应该用于别的东西。 Xcode语法高亮显示不喜欢它(它没有用variables名的其余部分给它着色)。

我希望给你足够的回答你的问题,虽然这可能只是促使你面对更多的问题。