Какой смысл @property и @synthesize?

Я не смог понять это, и нет никаких веб-сайтов, которые объясняют это достаточно ясно..., что точно является целями @property и @synthesize?

Заранее спасибо!

5
задан esqew 3 July 2010 в 00:33
поделиться

3 ответа

Objective-C Runtime Programming Guide: Declared Properties

@property объявляет методы получения и установки для общедоступного свойства, которое вы хотите реализовать. Например, это объявление свойства:

@property float value;

эквивалентно:

- (float)value;
- (void)setValue:(float)newValue;

@synthesize обеспечивает реализацию по умолчанию для этих двух методов доступа.

Обновление : выше объясняется, что делают эти двое. Это не объясняет, какова их цель. : -)

  • @property добавляет член к общедоступному интерфейсу, который действует как переменная данных для ваших клиентов класса, но читается и записывается с использованием методов. Это дает вам лучший контроль над данными, которыми обмениваются клиент и ваш код, например, вы можете выполнять расширенную проверку значений, заданных вашему коду.
  • @synthesize позволяет вам не писать явно код, который будет вызываться клиентом, и фактически самостоятельно обрабатывать свойство как переменную данных.
13
ответ дан 18 December 2019 в 08:26
поделиться

Символ «@» интерпретируется компилятором как директива. Это одно из «дополнений» Objective-C к языку C. Когда вы объявляете @property, а затем @synthesize, вы инструктируете компилятор создать для вас инструкции и соответствующие символы для геттеров и сеттеров. Помните, что на языке C оператор «=» означает «присваивать». Большую часть времени в объектно-ориентированном контексте, который предоставляют расширения Objective-C, мы работаем с указателями (также известными как ссылки) на структуры данных isa (классы в Objective-C).

До Objective-C 2.0 разработчик должен был кодировать все методы получения и установки для каждого атрибута, который в большинстве случаев был кодом копирования / вставки. Чтобы быть полностью совместимым с KVC / KVO, требуется много очень утомительного кода ... операторы willAccessValueForKey, didUpdateValueForKey и т. Д., Которые новый компилятор добавляет автоматически, когда вы используете синтаксис @ property / @ synthesize. Это огромный прирост производительности для разработчиков. Добавление точечного синтаксиса к языку вызывает немного больше споров в сообществе, поскольку оно скрывает магию , которую компилятор делает от вашего имени для интерпретации object.property = anotherObject.property; выражение как [object setProperty: [anotherObject property]];

Из документации Apple, упомянутой в других ответах

Атрибуты объявления свойств

Вы можете украсить свойство атрибутами, используя форму @property (attribute [, атрибут2, ...]). Как и методы, свойства ограничены объявлением их внешнего интерфейса.Для объявлений свойств, в которых используется список имен переменных, разделенных запятыми, атрибуты свойств применяются ко всем именованным свойствам.

Если вы используете директиву @synthesize, чтобы сообщить компилятору о необходимости создания метода (ов) доступа, код, который он генерирует, соответствует спецификации, заданной ключевыми словами. Если вы реализуете метод (ы) доступа самостоятельно, вы должны убедиться, что он соответствует спецификации (например, если вы указываете копию, вы должны убедиться, что вы действительно копируете входное значение в методе установки).

3
ответ дан 18 December 2019 в 08:26
поделиться

Небольшой пример того, почему вы не хотите делать просто "variable = 0":

Допустим, у вас есть это свойство:

@property (nonatomic, retain) id <MyDelegate> theDelegate;

Когда бы вы ни заменили этот делегат на новый, ваши синтезированные сеттеры и геттеры будут обрабатывать освобождение/сохранение для вас каждый раз, когда вы устанавливаете его так:

self.theDelegate = newObject;

На самом деле произошло следующее:

[self setTheDelegate:newObject];

- (void)setTheDelegate:(id <MyDelegate>)anObject {
    [theDelegate release];
    theDelegate = [anObject retain];
}

(Это, конечно, упрощено)

Вы можете делать очень мощные вещи в своих собственных сеттерах и геттерах, синтез нужен для тех, которые происходят снова и снова, например, сохраняемые свойства и т.д. При компиляции он смотрит на ваши @property и строит методы соответствующим образом.

0
ответ дан 18 December 2019 в 08:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: