iOS第一个应用程序“self.userName = textField.text”。 何时使用自我

这里是苹果的“你的第一个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调用合成设置方法(重要的,因为它有一个复制标志)。

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

这两个等价物吗? 是不是自己不必要,因为点符号已经存在,哪些已经可以访问get方法?

是的:在这种情况下, textField.text等同于self.textField.text ,因为合成的getter只是返回文本字段。 据推测苹果已经变得简单,因为他们希望代码是可读的。 尽pipe如此,我还是喜欢你的方法:对于属性,坚持使用访问器方法是个好习惯,以防你想要定制它们。

请注意,该属性是与内部variables分开的实体。 苹果的风格是给他们两个相同的名字,但一些程序员喜欢通过给内部variables分开这两个概念下划线前缀。 在这种情况下, _textField.text会在self.textField.text给出相同的结果。 但是只有第二个访问类的文本字段的getter方法 – 第一个是作为一个类内部代码来直接访问内部variables的权利。

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

最终的结果通常应该是一样的。 同时拥有一个名为textField的ivar和一个属性,并让该属性返回除了ivar之外的东西,这会有些奇怪。

这两个等价物吗? 是不是自己不必要,因为点符号已经存在,哪些已经可以访问get方法?

如上所述,结果是相似的,但意义不同。 使用访问器(即self.textField.text )是首选的样式,但用self.前缀self. 看起来也有点乏味。 如果你要重复使用一个属性,一个可能的补救措施是调用一次属性访问器,并将结果保存在一个局部variables中。

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

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

我更喜欢使用self.label版本更清晰,但这完全是一个编码实践。

因为你调用了一个方法(这不是免费的),所以当你使用self.label时候有一个性能问题很重要。 然而,在大多数阅读的情况下,性能的影响并不明显(只是很好知道)。