iOS First Application “self.userName = textField.t

2019-04-02 17:04发布

问题:

Here is a code snippet from Apple's "Your First iOS Application" document.

- (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];
}

I understand that self.username calls the synthesized set method (important since it has a copy flag).

Why is textField.text and label.text not self.textField.text and self.label.text.

Are the two equivalent? Is the self unnecessary since the dot notation is there already which would already access the get methods?

回答1:

Yes: textField.text is equivalent to self.textField.text in this case, because the synthesised getter simply returns the text field. Presumably Apple have gone for terseness because they want the code to be readable. I'd favour your approach though: with properties, it's a good habit to stick to the accessor methods, in case you ever want to customise them.

Note that the property is a separate entity from the internal variable. Apple's style is to give them both the same name, but some programmers like to separate the two concepts by giving internal variables underscore prefixes. In that case, _textField.text would give the same result here as self.textField.text. But only the second would be accessing your class's generated getter method for the text field - the first is exercising its right as a piece of class-internal code to access the internal variable directly.



回答2:

No, they're not the same. In the code you provided, textField.text translates to [textField text], i.e. gets the text property of the object pointed to by the textField ivar. self.textField.text, on the other hand, translates to [[self textField] text], i.e. calls the current object's textField accessor, and calls the text accessor of the result.

The end result should usually be the same. It would be somewhat strange to have both an ivar and a property named textField and to have the property return something other than the ivar.

Are the two equivalent? Is the self unnecessary since the dot notation is there already which would already access the get methods?

As explained above, the results are similar, but the meaning is different. Using the accessor (i.e. self.textField.text) is the preferred style, but prefixing everything with self. can seem a little tedious too. One possible remedy if you're going to use a property repeatedly is to call the property accessor once and keep the result in a local variable.



回答3:

Yes, Both are the same. You may use self.label.text or label.text (whichever) as both point to the same object.



回答4:

You said it yourself, they are equivalent since self.label and label will point to the same object.

I would prefer to use the self.label version for more clarity but that's entirely a coding practice.

It's important to point out that there's a performance hit when your use the self.label since you're calling a method (which is not free). However, in most read-world cases, the performance hit is not noticeable (just good to know).