gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:23:50 24 4
gpt4 key购买 nike

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

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

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

谢谢。

最佳答案

这是一小 jar ​​蠕虫。

@synthesize中使用了下划线,主要是为了区分实例变量和访问器名称。这很重要,尤其是当您不仅仅访问访问器中的变量时(例如,惰性初始化)。如果它们是相同的名称,您可以轻松地键入“foo”并获取实例变量,而您的意思是调用访问器方法的“self.foo”。因此,这就是在该上下文中使用下划线的原因。

现在,Apple 表示我们不应该在私有(private)方法 名称中使用前导下划线。他们将这个约定用于他们的私有(private)方法名称,您可能会无意中覆盖其中一个基类方法。那会很糟糕,尤其是因为您无法在编译时捕获它。

但是,他们表示可以为私有(private)实例变量使用下划线。事实上,举个例子,他们说在合成属性时对 ivar 使用前导下划线是完全可以的(并建议)。

现在,问题来了。他们还对私有(private)实例变量使用单个前导下划线。所以,如果你有相同的名字,你可能会发生冲突。要看到这一点,在 View Controller 方法的实现中,他们会“_”并查看代码完成会抛出什么问题。

那么,为什么他们不反对这种命名做法呢?因为冲突是在编译时捕获的。不能有两个同名的实例变量。如果您尝试这样做,您将收到错误消息。

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

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

__managedObjectContext = [[NSManagedObjectContext alloc] init];

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

顺便说一句,我看到人们使用美元符号作为他们的私有(private)合成名称的前导或尾随字符。

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

我已经编写 C/C++ 超过 25 年了,但我对 ObjC 还很陌生,它有其自身的复杂性。所以,我不是语言律师。我什至不是律师助理。我所知道的是它似乎是合法的 - 它适用于我尝试过的所有内容,但我不能肯定地说美元符号不应该用于其他用途。 Xcode 语法高亮器不喜欢它(它不会用变量名的其余部分给它着色)。

我希望这足以回答您的问题,尽管它可能只是促使您提出更多问题...

关于objective-c - XCode 模板中的 ivars 以一个或两个下划线为前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10258634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com