可能重复:
Should I use properties or direct reference when accessing instance variables internally?
我一直想知道:有没有特别的理由总是使用或不使用访问器方法(方括号或点符号)?每当我合成属性时,我就是这样...
@synthesize aProperty = _aProperty;
然后在我的代码中,我总是使用self.aProperty
代替_aProperty
。
在我看来,总是使用访问器是合乎逻辑的。但是,在大多数示例/教程代码中,作者似乎与此用法有些不一致,有时self.aProperty
,有时_aProperty
,有时甚至只有aProperty
(未在合成中设置别名) )。任何人都可以解释为什么总是使用访问器会或者不建议使用访问器,或者在哪种情况下它是不可取的?
答案 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直接访问它。