Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在Obj-C中使用访问器——这只是语义吗?_Objective C_Properties_Instance Variables_Accessor - Fatal编程技术网

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不会处理这些观察者。