2014-02-18 42 views

回答

2

区别很简单:使用self.label = [[UILabel alloc] init]实际上会调用方法[self setLabel:[[UILabel alloc] init]],并且使用_label = [[UILabel alloc] init]将直接将值赋给实例变量。

在实践中这是什么意思是,使用点语法通常是最好的方法可能调用处理了很多的东西给你,其中包括:

  • 内存管理:例如,如果您声明一个属性为'strong'或'retain'的属性,那么被调用的方法应该保留分配的对象。
  • 键值编码通知:对于属性,可能该类为key-value coding compliant,这意味着调用的方法会将更改通知给观察者对象。

为什么你不使用点语法?有两个可能的原因:

  • 为了避免副作用:一个好的做法是不使用的初始化方法里面的点语法。这是因为我们想要分配值但不希望被调用的方法出于安全原因的其他副作用。
  • 性能:这可能很少见,但也许您试图实现高性能的方法,直接使用实例变量可以节省调用方法的成本。

如果您想了解更多信息,我建议您阅读this iOS指南,其中详细介绍了我在此提及的想法。

1

的不同之处在于:

_variable名字都是实例变量。

self.variable正在调用对象的getter方法。

在你的例子中,实例变量是自动生成的,你也不需要综合你的属性。

,如果你不使用ARC-

self.variable如果您标记与保留或强_variable完全不

解决内存管理的属性将保留对您的对象在你的榜样,真正重要的区别进场
+0

Xcode在幕后与一个名为_xxxx的ivar合成@property xxxx。所以你不能说,_xxxxx是实例变量。 – Mani

0

在你的例子中,self.label会自我调用getter方法'label' - 这相当于调用[self label]_label是类实例属性的后备存储 - 即实例变量,与直接访问标准变量没有区别。没有getter方法缠绕它。

区别是非常非常重要的,因为您可以覆盖属性的getter/setter方法。您可能希望这样做,例如,如果您想要将某些行为更改与变量的状态更改捆绑在一起。调用getter或setter维护这种行为。调用getter也保留这个变量。

基本上,除非你知道你为什么喜欢在任何特定的例子中上课_label,那么坚持使用getter self.label。在初始化期间,您可能想要使用_label的一种情况是,您需要设置getter可能带来的快乐默认w/o行为。

0

区别在于使用_label直接访问实例变量(简称ivar),其中使用self.label实际上是调用[self setLabel:[[UILabel alloc] init]];

调用setLabel:方法会执行其他操作,例如可能保留该变量(取决于属性的声明方式),但也可以触发其他副作用,如setLabel:方法中设置的那样。这些副作用可能与数据验证类似,也可能将该值同步到服务器。

相关问题