0

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

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

  2. 如果我不创建私有实例变量,只需对其进行同步。那么我应该尝试访问什么self->foo变量self->_foo

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

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

4

2 回答 2

2

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

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

2.如果我不创建私有实例变量,只需对其进行同步。那么我应该尝试访问什么变量 self->foo 或 self->_foo ?

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

于 2013-07-22T09:15:06.107 回答
1

当 Xcode 自动合成一个属性时,它会自动添加一个支持实例变量,该变量与该属性同名并带有前缀_. 您无需手动指定实例变量,它会自动存在。

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

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

  1. 使用属性点表示法是通过自动合成-(PropertyType)property-(void)setProperty:(PropertyType)property方法访问属性的语法糖
于 2013-07-22T09:35:33.483 回答