由属性公开的私有变量

时间:2013-07-22 09:04:41

标签: objective-c properties

我搜索了一些文档,并尝试了Xcode和AppCode。但我仍然不确定一些事情。有人可以澄清一下:

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

  2. 如果我没有创建私有实例变量,只需将其同步即可。那么我应该尝试访问self->fooself->_foo

  3. 我已经看到了这两种方法,但两者都有效,所以我很好奇是否有任何编码规则或约定,因为我没有找到任何。

    注意:我对@synthetize foo=_foo不感兴趣;

2 个答案:

答案 0 :(得分:2)

  

1。如果我有名为foo的属性,我应该有名为_foo或foo的私有实例变量吗?

您不必自己创建实例变量。将自动为您创建一个以下划线为前缀的实例变量。由于您不应该直接访问变量(见下文),因此您不应该关心底层变量的调用。

  

2. 如果我没有创建私有实例变量,只需将其同步即可。然后我应该尝试访问self-> foo或self-> _foo?

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

答案 1 :(得分:1)

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

尽管self->_foo编译并且似乎有效,但我从未见过有人使用此语法来访问ivars。我发现它可能会与属性语法self.foo混淆,所以我会完全避免这种表示法。如果需要,可以直接键入_foo来访问实例变量。但我也会避免这种情况,除非你覆盖或扩展属性访问器方法。

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

  1. 使用属性点表示法是通过自动合成的-(PropertyType)property-(void)setProperty:(PropertyType)property方法访问属性的语法糖