【问题标题】:iOS First Application "self.userName = textField.text". When to use selfiOS 第一个应用程序“self.userName = textField.text”。何时使用自我
【发布时间】:2011-05-31 14:17:58
【问题描述】:

这是来自 Apple 的“您的第一个 iOS 应用程序”文档的代码 sn-p。

- (IBAction)changeGreeting:(id)sender {

self.userName = textField.text;

NSString *nameString = self.userName;
if ([nameString length] == 0) {
    nameString = @"World";
}
NSString *greeting = [[NSString alloc] initWithFormat:@"Hello, %@!", nameString];
label.text = greeting;
[greeting release];
}

我知道 self.username 调用了合成的 set 方法(很重要,因为它有一个复制标志)。

为什么 textField.text 和 label.text 不是 self.textField.text 和 self.label.text。

两者是等价的吗? self 是不必要的,因为点符号已经存在,它已经可以访问 get 方法?

【问题讨论】:

    标签: ios self accessor notation


    【解决方案1】:

    是的:textField.text 在这种情况下等同于 self.textField.text,因为合成的 getter 只是返回文本字段。据推测,Apple 之所以追求简洁,是因为他们希望代码可读。不过我更喜欢你的方法:对于属性,坚持使用访问器方法是一个好习惯,以防你想自定义它们。

    请注意,该属性是独立于内部变量的实体。 Apple 的风格是给它们两个相同的名称,但是一些程序员喜欢通过给内部变量下划线前缀来分隔这两个概念。在这种情况下,_textField.text 将在此处给出与self.textField.text 相同的结果。但只有第二种方法是访问您的类为文本字段生成的 getter 方法——第一种方法是行使它作为一段类内部代码直接访问内部变量的权利。

    【讨论】:

    • 感谢您的澄清。假设 textField 是其对象的类,已经适当地合成了 getter 和 setter 方法, _textField.text 会运行 get 方法吗?如果没有,如果 _textField 的 text 实例变量设置为 private 是否会无法访问?
    • 请注意,至少在some cases 中,Apple 保留下划线前缀供自己使用。您最好使用下划线后缀,例如使用textField_ 而不是_textField
    • @Ben: 是的,如果_textField 对象有text 属性,它应该提供一个getter(无论是否合成),并且点符号会调用它。如果它没有提供一个并且实例变量是私有的,那么其他类的对象确实无法访问数据。
    【解决方案2】:

    不,它们不一样。在您提供的代码中,textField.text 转换为[textField text],即获取textField ivar 指向的对象的text 属性。另一方面,self.textField.text 转换为[[self textField] text],即调用当前对象的textField 访问器,并调用结果的text 访问器。

    最终结果通常应该相同。同时拥有一个 ivar 和一个名为 textField 的属性并让该属性返回除 ivar 之外的其他内容会有些奇怪。

    这两个是等价的吗?是自我 不必要的,因为点符号是 已经有 访问 get 方法?

    如上所述,结果相似,但含义不同。使用访问器(即self.textField.text)是首选样式,但在所有内容前加上self. 似乎也有点乏味。如果您要重复使用某个属性,一种可能的补救方法是调用一次属性访问器并将结果保存在局部变量中。

    【讨论】:

      【解决方案3】:

      是的,两者都是一样的。您可以使用 self.label.text 或 label.text (无论哪个)都指向同一个对象。

      【讨论】:

        【解决方案4】:

        你自己说的,它们是等价的,因为self.labellabel 将指向同一个对象。

        为了更清晰,我更喜欢使用self.label 版本,但这完全是一种编码习惯。

        重要的是要指出,当您使用self.label 时会影响性能,因为您正在调用一个方法(这不是免费的)。但是,在大多数读取世界的情况下,性能影响并不明显(很高兴知道)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多