Первое iOS-приложение "self.userName = textField.text". Когда использовать себя
Вот фрагмент кода из документа 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 вызывает метод синтезированного множества (важно, поскольку у него есть флаг копирования).
Почему textField.text и label.text не являются self.textField.text и self.label.text.
Эти два эквивалента? Является ли self ненужным, поскольку уже существует точечная нотация, которая уже использовала бы методы get?
4 ответа
Нет, они не одинаковы. В коде, который вы предоставили, textField.text
переводит на [textField text]
то есть получает text
свойство объекта, на которое указывает textField
Ивар. self.textField.text
с другой стороны, переводится как [[self textField] text]
то есть вызывает текущий объект textField
Accessor, и вызывает text
средство доступа к результату.
Конечный результат обычно должен быть одинаковым. Было бы несколько странно иметь как ivar, так и свойство с именем textField
и чтобы свойство возвращало что-то кроме ивара.
Эти два эквивалента? Является ли self ненужным, поскольку уже существует точечная нотация, которая уже использовала бы методы get?
Как объяснено выше, результаты похожи, но смысл другой. Использование средства доступа (т.е. self.textField.text
) является предпочтительным стилем, но с префиксом self.
может показаться немного утомительным тоже. Одно из возможных решений, если вы собираетесь использовать свойство несколько раз, - это вызвать метод доступа к свойству один раз и сохранить результат в локальной переменной.
Да: textField.text
эквивалентно self.textField.text
в этом случае, потому что синтезированный геттер просто возвращает текстовое поле. Предположительно Apple пошла за краткость, потому что они хотят, чтобы код был читабельным. Я бы предпочел ваш подход: со свойствами, это хорошая привычка придерживаться методов доступа, если вы когда-нибудь захотите их настроить.
Обратите внимание, что свойство является отдельной сущностью от внутренней переменной. Стиль Apple состоит в том, чтобы дать им обоим одно и то же имя, но некоторые программисты предпочитают разделять две концепции, давая внутренним переменным подчеркивание префиксов. В таком случае, _textField.text
даст тот же результат, что и здесь self.textField.text
, Но только второй будет обращаться к сгенерированному методу getter вашего класса для текстового поля - первый использует свое право как часть внутреннего кода класса для прямого доступа к внутренней переменной.
Да, оба одинаковы. Вы можете использовать self.label.text или label.text (в зависимости от того), так как оба указывают на один и тот же объект.
Вы сказали это сами, они эквивалентны, так как self.label
а также label
будет указывать на тот же объект.
Я бы предпочел использовать self.label
версия для большей ясности, но это полностью практика кодирования.
Важно отметить, что при использовании self.label
так как вы вызываете метод (который не является бесплатным). Тем не менее, в большинстве случаев, связанных с чтением, снижение производительности не заметно (просто полезно знать).