我的教授已多次明确告诉我们在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
,正如我的教授所认为的那样。我是一个新秀,只是把我的头围绕着属性并合成,所以我需要你的帮助。
另外,我可以做些什么来自己测试或在文档中找到实际的答案?谢谢。
答案 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