1

这是 Apple 的“您的第一个 iOS 应用程序”文档中的代码片段。

- (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。

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

4

4 回答 4

2

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

最终结果通常应该是相同的。同时命名一个 ivar 和一个属性textField,并让该属性返回除 ivar 之外的其他内容,这有点奇怪。

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

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

于 2011-05-31T15:43:10.540 回答
2

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

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

于 2011-05-31T14:26:54.827 回答
0

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

于 2011-05-31T14:28:52.887 回答
-1

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

为了更清晰,我更愿意使用该self.label版本,但这完全是一种编码实践。

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

于 2011-05-31T14:25:30.250 回答