Objective c 在Obj-C中使用访问器——这只是语义吗?
可能重复:Objective c 在Obj-C中使用访问器——这只是语义吗?,objective-c,properties,instance-variables,accessor,Objective C,Properties,Instance Variables,Accessor,可能重复: 我一直在想:总是使用或不使用访问器方法(方括号或点符号)有什么特别的原因吗?每当我合成属性时,我都是这样做的 @synthesize aProperty = _aProperty; 然后在我的代码中,我总是使用self.aProperty而不是\u aProperty 在我看来,总是使用访问器是合乎逻辑的。然而,在大多数示例/教程代码中,作者似乎与此用法有些不一致,有时是self.aProperty,有时是\u aProperty,有时甚至只是aProperty(在synthes
我一直在想:总是使用或不使用访问器方法(方括号或点符号)有什么特别的原因吗?每当我合成属性时,我都是这样做的
@synthesize aProperty = _aProperty;
然后在我的代码中,我总是使用self.aProperty
而不是\u aProperty
在我看来,总是使用访问器是合乎逻辑的。然而,在大多数示例/教程代码中,作者似乎与此用法有些不一致,有时是
self.aProperty
,有时是\u aProperty
,有时甚至只是aProperty
(在synthesis中未设置别名)。有人能解释为什么总是使用访问器是可取的还是不可取的,或者在什么情况下是不可取的吗?据我所知,在任何情况下都不可取使用访问器。这一切都只是语义;使用访问器意味着您可以重用这些变量名(属性),如果您愿意的话,这在自定义设置器中非常好。然而,这也意味着您要记住范围并使用self.aProperty
当我教一个新的初级开发人员时,我让他们使用访问器,因为它迫使他们记住范围
但我对自己没有打扰他们感到非常内疚,只是合成变量并直接访问它(不使用self)
--因评论而更新--
我把这个问题看作是一个更高层次的问题,但是从程序的角度来看,绝对值得注意的是,下面的评论是绝对的,100%正确的,我很抱歉没有澄清这一点
构造函数和反构造函数中不应使用访问器,因为这些子类可能不稳定,这可能会导致崩溃。我一直听说的底线是:您应该始终使用合成的getter和setter。但是,有时您需要直接访问变量,特别是当您可能重写合成的getter或setter以返回/设置一些已处理的数据,但还需要从类内部访问原始数据时 例如:
@synthesize firstName = _firstName;
假设在本例中,您希望使用默认setter,但希望覆盖getter,以始终返回名字的规范化版本(对不起,我知道这很奇怪,但我可以在脑海中想出一个更好的示例)。所以你可以这样做
- (NSString*)getFirstName {
return [_firstName lowercaseString];
}
无论何时使用[self firstName]或self.firstName,您都将通过getter访问变量,并返回小写版本。但是,如果仍然需要访问原始变量,可以使用_firstName直接访问它。在解除分配和初始化期间,应该直接使用ivar,因为子类可能会重写属性的方法来完成您的类不希望完成的事情。有一种非常重要的情况是您不应该使用访问器:在对象构造和销毁期间,即在
init…
和dealoc
@Geekswordsman谢谢。我应该澄清一下,我不是在谈论初始化。然而,对于ARC,我们不再进行处理。因此,使用ivar(_aProperty)初始化,但通过设置为nil(self.aProperty=nil)释放,例如在viewDidUnload中。对吧?如果你想的话,你可以把它们设为零,但不是必须的。要做的主要事情是确保移除任何观察者,因为ARC不会处理这些观察者。