Доступ к недвижимости, стиль или содержание? - PullRequest
2 голосов
/ 30 июня 2011

Существует три различных стиля синтаксиса для доступа к свойствам объекта:

myProp = value;
self.myProp = value;
[self setMyProp: value];

Это чисто стиль или есть разница в содержании?

Ответы [ 4 ]

4 голосов
/ 30 июня 2011
self.myProp = value;

и

[self setMyProp: value];

- выбор стиля, поскольку они используют методы доступа для установки значений. То есть self.myProp по сути то же самое, что и вызов [self setMyProp] или [self myProp]. Он будет реализовывать любой механизм, который вы определили в теге @property (сохранение, освобождение при необходимости и т. Д.).

Однако

myProp = value;

существенно отличается, так как это просто задание. Не нужно выпускать оригинальный указатель myProp, сохранять новое значение и т. Д.

2 голосов
/ 30 июня 2011

Первое - это прямое назначение iVar myProp.Второй и третий одинаковы.Вы должны предпочесть второе или третье, потому что когда вы используете @synthesize, сеттер выполняет управление памятью за вас.

1 голос
/ 30 июня 2011

Ваши примеры # 2 и # 3 компилируются одинаково, но # 1 имеет важное отличие - он не вызывает метод setter.Это делает его полезным (обязательным) внутри установщика, иначе вы создадите бесконечный цикл.

Например, этот установщик создает бесконечный цикл:

- (void)setMyProp:(int)value
{
self.myProp = value;
}

То же самое возможно вдобытчик.

1 голос
/ 30 июня 2011
myProp = value;

Это прямое присвоение переменной C.Это вообще не доступ к свойству.

self.myProp = value;

Это синтаксический сахар для:

[self setMyProp: value];

Что это значит?Это означает, что первый преобразуется компилятором во второй, прежде чем выдавать код для него.Это означает only точечной нотации.Пока класс объявляет методы myProp и setMyProp:, точечная нотация будет работать.myProp не обязательно должно быть свойством в формальном смысле (т. Е. Объявлено с @property).Это также не должно быть синтезировано.Там не должно быть единственной переменной экземпляра, чтобы поддержать это.Пока эти два метода существуют во время выполнения (или метод получения, если вы никогда не присваиваете свойству), вы можете использовать точечную нотацию.Он ортогонален свойствам Objective-C.

Так что ответ таков: да, для ваших вторых двух примеров это чисто вопрос стиля.Лично я ненавижу точечные обозначения.Это ненужное загрязнение синтаксиса языка (я имею в виду, что теперь у нас есть два способа выражения отправки сообщений, один из которых выглядит идентично совершенно другой языковой функции)./ Декламация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...