Первое iOS-приложение "self.userName = textField.text".Когда использовать себя - PullRequest
1 голос
/ 31 мая 2011

Вот фрагмент кода из документа 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 ]

2 голосов
/ 31 мая 2011

Нет, они не одинаковы.В предоставленном вами коде textField.text преобразуется в [textField text], то есть получает свойство text объекта, на который указывает ивар textField.self.textField.text, с другой стороны, преобразуется в [[self textField] text], то есть вызывает метод доступа textField текущего объекта и вызывает метод доступа text результата.

Конечный результат обычно должен быть таким же,Было бы несколько странно иметь и ивар и свойство с именем textField и иметь свойство, возвращающее что-то отличное от ивара.

Являются ли эти два эквивалента?Является ли self ненужным, так как уже существует точечная нотация, которая уже использовала бы методы get?

Как объяснено выше, результаты аналогичны, но смысл другой.Использование метода доступа (то есть self.textField.text) является предпочтительным стилем, но добавление префикса ко всему с помощью self. также может показаться немного утомительным.Одно из возможных решений, если вы собираетесь использовать свойство несколько раз, - это вызвать метод доступа к свойству один раз и сохранить результат в локальной переменной.

2 голосов
/ 31 мая 2011

Да: textField.text эквивалентно self.textField.text в этом случае, потому что синтезированный геттер просто возвращает текстовое поле. Предположительно, Apple пошла ради краткости, потому что они хотят, чтобы код был читабельным. Я бы предпочел ваш подход: со свойствами, это хорошая привычка придерживаться методов доступа, если вы когда-нибудь захотите их настроить.

Обратите внимание, что свойство является отдельной сущностью от внутренней переменной. Стиль Apple состоит в том, чтобы дать им обоим одно и то же имя, но некоторые программисты предпочитают разделять две концепции, давая внутренним переменным подчеркивание префиксов. В этом случае _textField.text даст тот же результат, что и self.textField.text. Но только второй будет обращаться к сгенерированному методу getter вашего класса для текстового поля - первый использует свое право как часть кода класса для прямого доступа к внутренней переменной.

0 голосов
/ 31 мая 2011

Да, оба одинаковы.Вы можете использовать self.label.text или label.text (в зависимости от того), так как оба указывают на один и тот же объект.

0 голосов
/ 31 мая 2011

Вы сказали это сами, они эквивалентны, поскольку self.label и label будут указывать на один и тот же объект.

Я бы предпочел использовать версию self.label для большей ясности, но это полностью кодированиепотренируйтесь.

Важно отметить, что при использовании self.label наблюдается снижение производительности, поскольку вы вызываете метод (который не является бесплатным).Тем не менее, в большинстве случаев, связанных с чтением, снижение производительности не заметно (просто полезно знать).

...