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.label
和label
将指向同一个对象。
我更喜欢使用self.label
版本更清晰,但这完全是一个编码实践。
因为你调用了一个方法(这不是免费的),所以当你使用self.label
时候有一个性能问题很重要。 然而,在大多数阅读的情况下,性能的影响并不明显(只是很好知道)。