1

我的教授多次明确告诉我们,在 Xcode 4.6 调用中:

@synthesize suit;

与调用相同:

@synthesize suit = _suit;

在那个 Xcode 将创建一个 ivar 并使用下划线命名约定命名它(示例@property suit将获得一个名为 ivar 的 ivar _suit

但是,我一直在查看文档,并在Apple Documentation EncapsulatingData中找到了这段话

重要提示:如果您使用 @synthesize 而不指定实例变量名称,例如:@synthesize firstName; 实例变量将具有与属性相同的名称。在此示例中,实例变量也将称为 firstName,不带下划线。

这似乎与我的教授直接矛盾。:(

这是我所知道的。在 Xcode 4.6 中,任何@property声明的内容都会@synthesize自动获得 -ed,因此您甚至不需要调用@synthesize. 如果您允许 Xcode 自动合成,它会使用 ivar 下划线名称 ( _suit)。但是,如果您实现自定义 getter 和 setter,则必须@synthesize显式调用。

我的问题是这个。当您有一个自定义的 getter 和 setter(就像我一样)并且需要调用时@ synthesize,Xcode 是否在您未指定名称时使用默认的下划线命名方案?

例如,当我这样称呼时:

@synthesize suit;

Xcode 是否命名底层 ivarsuit_suit?

从我的简单测试和阅读文档来看,这似乎不是我的教授认为的那样@synthesize suit;。我是个菜鸟,我只是在属性和合成上纠结,所以我需要你的帮助。 @synthesize suit = suit@synthesize suit = _suit

另外,我该怎么做才能自己测试或在文档中找到实际答案?谢谢。

4

2 回答 2

7

这是官方的词——用Objective C 封装数据编程,也许也是混淆的根源

大多数属性都由实例变量支持

除非您另外指定,否则合成的实例变量与属性具有相同的名称,但带有下划线前缀。例如,对于名为 firstName 的属性,合成的实例变量将称为 _firstName。

在同一页面的下方(您引用的部分)......

您可以自定义合成的实例变量名称

重要提示:如果您使用@synthesize时未指定实例变量名称,如下所示:
@synthesize firstName;
实例变量将与属性具有相同的名称。
在这个例子中,实例变量也将被调用firstName,没有下划线。

它们似乎确实自相矛盾,但前面的段落仅指自动合成的实例变量,而后者是当您显式合成时发生的情况。

自动合成是一个更新的特性,它只在 XCode 4.4 版中出现,并包含了 Clang 编译器 v4。在此之前,关于@synthesizing 你的变量是否带有前导下划线(传说这是留给Apple 使用)、尾随下划线(Google 的objective-C 风格指南)或两者都没有的优缺点一直存在无休止的争论。从 XCode 4.4 开始,这已解决:使用前导下划线显式命名所有 iVar,但最好还是让编译器为您完成。

更新:我注意到谷歌已经更新了他们的风格指南以适应我们其他人......

尾随下划线曾经是实例变量名的首选。

我们的风格指南曾经有一条规则,即实例变量的命名应带有尾随下划线,类似于 C++ 中成员变量的命名。这已更改为前导下划线以与更广泛的 Objective-C 社区保持一致,以更好地遵循 Apple 的官方指南,并允许使用新的编译器功能,如自动实例变量合成。强烈鼓励新项目使用前导下划线。现有项目可能会继续在新代码中使用尾随下划线,以保持与其他代码库的一致性。

于 2013-01-31T00:11:59.937 回答
1

你是对的(你的教授不是)。@synthesize如果未指定变量名,则创建一个与属性同名的 ivar。

@synthesize foo;

...将创建一个名为foo

于 2013-01-31T00:02:16.343 回答