【问题标题】:should I always use self.classvariable?我应该总是使用 self.classvariable 吗?
【发布时间】:2012-01-10 18:22:06
【问题描述】:

在编写我的 iPhone 应用程序时。设置或获取使用 self 的值时总是一个好习惯吗?我似乎忘记了一半的时间,最近一直在追踪一个我认为与此有关的错误。

我应该总是使用 self 还是在某些情况下它没有必要或会导致问题?

编辑: 这是我在代码中所做的示例

else if([CellIdentifier isEqualToString:@"Linked Item"]) {
        linkedItemLabel = [[UILabel alloc] initWithFrame:CGRectMake(120, 5, 160, 34)];
        linkedItemLabel.adjustsFontSizeToFitWidth = YES;
        linkedItemLabel.textColor = [UIColor blackColor];
        linkedItemLabel.font = [UIFont systemFontOfSize:17.0];
        linkedItemLabel.text = [storedValuesMutableArray objectAtIndex:7];
        linkedItemLabel.backgroundColor = [UIColor clearColor];
        linkedItemLabel.textAlignment = UITextAlignmentRight;
        [cell addSubview:linkedItemLabel];}

这是为需要填写的表单设置我的 tableviewcells 的代码的一部分。我应该使用 self.linkedItemLabel 还是这样好吗?

【问题讨论】:

标签: iphone objective-c self


【解决方案1】:

问题出在属性上。如果您不添加 self.,那么您最终会直接分配给变量,从而错过属性属性,例如保留、分配,从而弄乱项目的引用计数,从而导致潜在的内存泄漏。

你应该使用 self,除非你有明确的理由不这样做。

【讨论】:

  • 有人可以确认吗?这似乎是我最容易掌握的答案。我也很好奇不使用 self 的明确原因。
【解决方案2】:

您必须以聪明而清晰的理解来使用它。 如果您使用所谓的点语法(即 self.myVariable),则意味着您正在调用属性的 getter 或 setter,这实际上是发送到对象实例的选择器,这在 Objective-C 中相当繁重运行。因此,如果您只需要 var 的值 - 您可以调用一次并重复使用保存的状态或直接调用 i-var(如果权限允许)。

在您真正需要时调用 getter/setter。

【讨论】:

    【解决方案3】:

    视情况而定,如果你只是使用@synthesize 来自动生成getter,那么它不会对getter 造成任何问题。虽然常见的 OO 实践告诉您使用encapsulation,但您会注意到几乎所有苹果示例代码都直接访问ivar

    另一个不使用 self 引用 ivar 的常见做法是这样合成:

    @synthesize myVar=_myVar
    

    并在引用该变量时使用 _myVar。

    如果您在 getter 中实现了某些东西,而不是使用 @synthesize,这只会导致问题。

    至于设置器,这并不是一个问题,但您只需要记住,该 ivar 的属性只有在您执行 self.myIvar 时才会应用,而不是直接访问 iVar,所以对于例如声明为 (retain) 的属性,只有在您使用 self.myIvar = newValue as 而不是 myIvar = newValue 时才会保留。

    【讨论】:

      【解决方案4】:

      你要明白,使用self.property是一个方法调用(getter或者setter方法),而不是简单的赋值。

      您应该只在 setter 或 getter 主体内直接使用 ivar。

      原因:

      1/ 属性旨在保护您免受保留释放地狱的影响。假设您有一个“分配”属性,您直接使用 ivar,然后您决定将其更改为“保留”。你得到的是一个很难找到的错误。

      2/ Setter 和 getter 可以做额外的功能(例如,setter 可以向对象添加/删除观察者)或日志记录。如果您直接使用 ivar,您会错过这个特殊功能。

      3/ Setter 和 getter 可以在子类中被覆盖。

      在小型项目中,即使您直接使用 ivars 也可以避免大多数问题,但在由团队编写的大型项目中,您应该只使用 self.property 以减少错误并提高代码可维护性。 给您的 ivar 起一个不同的名称也是一个好主意(例如 property__property,因为当您在不使用 self. 的情况下使用它时会注意到。

      如果您不是在编写高性能游戏或数学算法,请不要担心使用self.property 时性能会变差。

      【讨论】:

      • 所以在我上面的例子中......只是为了让我的生活更轻松,我应该将 self 用于所有这些东西?
      • 是的。这只是一种很好的编程习惯,可以让您的生活更轻松。
      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 2016-07-06
      相关资源
      最近更新 更多