Xcode 4.6如何命名@synthesized ivars?

时间:2013-01-30 23:16:41

标签: objective-c xcode xcode4.6

我的教授已多次明确告诉我们在Xcode 4.6中呼叫:

@synthesize suit;

与调用相同:

@synthesize suit = _suit;

该Xcode将创建一个ivar并使用underbar命名约定命名(例如@property suit将获得一个名为_suit的ivar

但是,我一直在查看文档,并在Apple Documentation EncapsulatingData

中找到了这段话
  

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

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

这就是我所知道的。在Xcode 4.6中,声明的所有@property都会自动生成@synthesize - 因此您甚至无需致电@synthesize。如果您允许Xcode自动合成,则使用ivar下划线名称(_suit)。但是,如果您实施自定义getter和setter,则必须明确调用@synthesize

我的问题是这个。当你有一个自定义的getter和setter(就像我有)并且需要调用@ synthesize时,如果你没有指定名字,Xcode会使用默认的underbar命名方案吗?

例如,当我这样称呼时:

@synthesize suit;

Xcode是否为底层ivar suit_suit命名?

从我的简单测试和阅读文档看来,@synthesize suit;变为@synthesize suit = suit而不是@synthesize suit = _suit,正如我的教授所认为的那样。我是一个新秀,只是把我的头围绕着属性并合成,所以我需要你的帮助。

另外,我可以做些什么来自己测试或在文档中找到实际的答案?谢谢。

2 个答案:

答案 0 :(得分:7)

这是官方用语 - 使用Objective C进行编程 Encapsulating Data,也许也是混乱的根源

  

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

     

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

再往下一页(你引用的部分)......

  

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

     

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

它们几乎似乎与自己相矛盾,但前面的段落只是指自动合成的实例变量,而后者则是明确合成时发生的事情。

自动合成是一个更新的特性,只有在包含Clang编译器v4的4.4版本中才出现在XCode中。在此之前,有endless debates关于@synthesizing你的变量的优点和缺点有一个领先的下层(legend had it,这是为Apple的使用保留),一个尾随的下划线(谷歌的objective-C style guide)或两者都不由于XCode 4.4已经解决了这个问题:使用前导下划线明确命名所有iVars,但更好的是让编译器为您完成。

更新:我发现Google已updated their style guide与我们其他人合作......

  

尾随下划线曾经是首选变量名称。

     

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

答案 1 :(得分:1)

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

@synthesize foo;

...将创建名为foo

的ivar