在Obj-C中使用访问器 - 它只是语义吗?

时间:2011-11-09 19:19:59

标签: objective-c properties instance-variables accessor

  

可能重复:
  Should I use properties or direct reference when accessing instance variables internally?

我一直想知道:有没有特别的理由总是使用或不使用访问器方法(方括号或点符号)?每当我合成属性时,我就是这样...

@synthesize aProperty = _aProperty;

然后在我的代码中,我总是使用self.aProperty代替_aProperty

在我看来,总是使用访问器是合乎逻辑的。但是,在大多数示例/教程代码中,作者似乎与此用法有些不一致,有时self.aProperty,有时_aProperty,有时甚至只有aProperty(未在合成中设置别名) )。任何人都可以解释为什么总是使用访问器会或者不建议使用访问器,或者在哪种情况下它是不可取的?

2 个答案:

答案 0 :(得分:0)

据我所知,没有不建议使用访问器的情况。它只是语义;使用访问器意味着如果你愿意,你可以重用那些变量名(aProperty),这在自定义setter中可能很好。但是,这也意味着您要记住范围并使用self.aProperty。

当我教一个新的初级开发人员时,我让他们使用访问者,因为它迫使他们记住范围。

但是我自己并不感到内疚,只是合成变量并直接访问它(不使用自己)。

- 由于评论而更新 -

我把这个问题作为一个更高层次的问题,但是在程序化的基础上绝对值得注意的是,下面的评论是绝对的,100%正确的,我为不澄清这一点而道歉。

访问者应该从不在构造函数和解构函数中使用,因为这些子类可能不稳定,这可能导致崩溃。

答案 1 :(得分:0)

我总是听到它的底线:你应该总是使用合成的吸气剂和设定器。但是,有时您需要直接访问变量,尤其是当您可以覆盖合成的getter或setter以返回/设置某些已处理的数据但还需要从类内部访问原始数据时。

示例:

@synthesize firstName = _firstName;

在这个例子中说你想使用默认的setter,但你想要覆盖getter以便总是返回名字的标准化版本(对不起,我知道它很奇怪,但我可以想到一个更好的例子。我的头)。所以你可以这样做。

- (NSString*)getFirstName {
    return [_firstName lowercaseString];
}

无论何时使用[self firstName]或self.firstName,您都将通过getter访问变量并返回小写版本。但是,如果您仍需要访问原始变量,则可以使用_firstName直接访问它。