我知道实例变量和属性。我经常看到有人初始化一个UILabel
这样当初始化这些变量时使用self.variable和_variable之间的区别
self.label = [[UILabel alloc] init]; //and
_label = [[UILabel alloc] init];
那么,什么是使用self.label
和_label
设置对象之间的区别?
我知道实例变量和属性。我经常看到有人初始化一个UILabel
这样当初始化这些变量时使用self.variable和_variable之间的区别
self.label = [[UILabel alloc] init]; //and
_label = [[UILabel alloc] init];
那么,什么是使用self.label
和_label
设置对象之间的区别?
区别很简单:使用self.label = [[UILabel alloc] init]
实际上会调用方法[self setLabel:[[UILabel alloc] init]]
,并且使用_label = [[UILabel alloc] init]
将直接将值赋给实例变量。
在实践中这是什么意思是,使用点语法通常是最好的方法可能调用处理了很多的东西给你,其中包括:
为什么你不使用点语法?有两个可能的原因:
如果您想了解更多信息,我建议您阅读this iOS指南,其中详细介绍了我在此提及的想法。
的不同之处在于:
与_variable
名字都是实例变量。
self.variable
正在调用对象的getter方法。
在你的例子中,实例变量是自动生成的,你也不需要综合你的属性。
,如果你不使用ARC-
self.variable
如果您标记与保留或强_variable
完全不
Xcode在幕后与一个名为_xxxx的ivar合成@property xxxx。所以你不能说,_xxxxx是实例变量。 – Mani
在你的例子中,self.label
会自我调用getter方法'label' - 这相当于调用[self label]
。 _label
是类实例属性的后备存储 - 即实例变量,与直接访问标准变量没有区别。没有getter方法缠绕它。
区别是非常非常重要的,因为您可以覆盖属性的getter/setter方法。您可能希望这样做,例如,如果您想要将某些行为更改与变量的状态更改捆绑在一起。调用getter或setter维护这种行为。调用getter也保留这个变量。
基本上,除非你知道你为什么喜欢在任何特定的例子中上课_label
,那么坚持使用getter self.label
。在初始化期间,您可能想要使用_label
的一种情况是,您需要设置getter可能带来的快乐默认w/o行为。
区别在于使用_label直接访问实例变量(简称ivar),其中使用self.label实际上是调用[self setLabel:[[UILabel alloc] init]];
。
调用setLabel:
方法会执行其他操作,例如可能保留该变量(取决于属性的声明方式),但也可以触发其他副作用,如setLabel:
方法中设置的那样。这些副作用可能与数据验证类似,也可能将该值同步到服务器。
它只是一个约定,以表示它的私有变量。我相信在概念上是一样的。 – Mutant