有谁知道为什么在XCode的模板(至少在XCode中4.3.2)前缀一些高德以两个下划线,有的只有一个?
例如,主从应用程序模板中包含文件MasterViewController.m,在那里可以找到:
@synthesize detailViewController = _detailViewController;
@synthesize fetchedResultsController = __fetchedResultsController;
@synthesize managedObjectContext = __managedObjectContext;
谢谢。
这是蠕虫的小罐。
下划线在@synthesize使用,主要是为了区分存取名称实例变量。 这是很重要的,特别是如果你做的不仅仅是访问您的访问(例如,延迟初始化)的变量。 如果它们是同一个名字,你可以很容易地键入“富”,并获得实例变量,当你的意思是“self.foo”,它调用访问方法。 所以,这就是为什么下划线在这种情况下被使用。
现在,苹果已经表示,我们不应该使用私有方法的名字前面的下划线。 他们使用该约定为他们的私有方法的名字,你可能无意中覆盖的基类的方法之一。 这将是不好的,尤其是因为你没有将能够赶上这在编译时。
然而,他们说,这是确定以使用私人实例变量下划线。 事实上,作为一个例子,他们说这是完全确定(和建议),以用于高德前导下划线在合成属性。
现在,这里的渔获物。 他们还利用私人实例变量一个前导下划线。 所以,如果你有相同的名字,你可能有冲突。 看到这一点,在一个视图控制器方法的实现,他们“_”,看看代码完成抛出自己的方式。
那么,为什么他们不鼓励这样的命名方式? 因为冲突是在编译时捕获。 你不能有两个同名的实例变量。 如果你尝试这样做,你会得到一个错误。
现在,为什么他们的代码模板生成带有双下划线的名字? 我不知道。 在“执行”实际上保留了领先的双下划线(后跟大写字母),但我们看到ObjC增加像__block。
对于我的钱,我避免与领先的双下划线任何东西。 苹果可以做任何他们希望在他们生成的代码。 FWIW,他们的一些生成ARC代码仍然引用旧的非ARC关键字,所以我不会拿自己生成的代码为福音。 FWIW,我肯定不会保持自己生成的代码的核心数据。 在最低限度,你应该改变(在managedObjectContext存取方法):
__managedObjectContext = [[NSManagedObjectContext alloc] init];
至
__managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
顺便说一句,我看到有人用一个美元符号作为开头或结尾的字符当作自己的私有合成名称。
@synthesize foo = $foo;
@synthesize bar = bar$;
我一直在写C / C ++超过25年,但我是相当新的ObjC,它有其自身的复杂性。 所以,我不是一个语言律师。 我甚至律师助理。 我所知道的是,它似乎是合法的 - 它适用于一切我已经试过,但我不能肯定说是美元符号是不应该被用于别的东西。 Xcode的语法高亮不喜欢它(它不与变量名的其余部分颜色的话)。
我希望给你足够的回答你的问题,但它可能只是促使你往更多的问题......