2013-07-22 40 views
0

我搜索了一些文档,并尝试了Xcode和AppCode。但我仍然不确定几件事情。因此,有人可以澄清我:由属性公开的私有变量

  1. 如果我有属性名为foo,我应该有私有的实例变量命名_foofoo

  2. 如果我不要创建一个私有实例变量,只是将其同步化。那么我应该尝试访问哪个变量self->fooself->_foo

我已经看到了这两种方法都和工作,所以我很好奇,如果有这方面的任何编码规则或惯例,因为我没有找到任何。

说明:我对@synthetize foo=_foo不感兴趣;

+0

这两个不工作访问属性,相反,宣告* foo的伊娃*和* foo属性*会让你最终得到两个易混淆的ivars:'_foo'和'foo'。 –

回答

2

如果我有属性名为foo,我应该有私有的实例变量命名_foo还是富?

您不必自己创建实例变量。将自动为您创建一个带有下划线前缀的实例变量。既然你不应该直接访问变量(见下面),你不应该关心底层变量的调用。

2.如果我不创建一个私人实例变量,只是将其同步化。那么我应该尝试访问self> foo或self - > _ foo的变量是什么?

Niether。该属性的想法是使用访问器而不是直接访问变量。您应该使用self.foo来获取和设置属性(如果您不喜欢点语法,则应使用[self foo][self setFoo:newFoo];)。另请注意,您不必显式合成该属性。

+0

1.您可以提供一些关于该文档的链接吗?因为我几乎可以肯定,这两个版本(强调和不强调)的作品都是一样的。 2.我很喜欢点符号,但是在某些情况下我想直接访问私有变量,忽略访问器。 –

+0

[Xcode 4.4中的新特性](http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_4_4.html) –

+1

[在什么情况下是@synthesize自动在Objective- (http://stackoverflow.com/a/9368743/608157) –

1

当Xcode自动合成一个属性时,它会自动添加一个支持的实例变量,该变量的名称与该属性的名称相同,其前缀为_。您不需要手动指定实例变量,它会自动在那里。

虽然self->_foo编译和似乎工作,我从来没有见过任何人使用此语法来访问ivars。我发现它可能与属性语法self.foo混淆,所以我会完全避免这种表示法。如果需要,可以直接输入_foo来访问实例变量。但我也会避免这种情况,除非您重写或扩展属性访问器方法。

我只会通过属性点符号[1]访问属性,这个属性让IMHO使代码更具可读性,并处理您在声明属性时指定的强/弱/复制语义。

  1. 使用属性点符号是语法糖通过自动syhthesized -(PropertyType)property-(void)setProperty:(PropertyType)property方法