Свойство - это удобный способ реализации метода получения / установки для некоторого значения с дополнительными полезными функциями и синтаксисом. Свойство может быть поддержано переменной экземпляра, но вы также можете определить метод получения / установки, чтобы сделать что-то более динамичное, например, Вы можете определить свойство lowerCase для строки, которая динамически создает результат, а не возвращает значение некоторой переменной-члена.
Вот пример:
// === In your .h ===
@interface MyObject {
NSString *propertyName;
}
// ...
@property (nonatomic, retain) NSString *propertyName;
// === In your .m @implementation ===
@synthesize propertyName /* = otherVarName */;
Строка @property
определяет свойство с именем propertyName
типа NSString *
. Это можно получить / установить, используя следующий синтаксис:
myObject.propertyName = @"Hello World!";
NSLog("Value: %@", myObject.propertyName);
Когда вы присваиваете или читаете из myObject.propertyName
, вы действительно вызываете методы установки / получения для объекта.
Строка @synthesize
указывает компилятору генерировать эти методы получения / установки для вас, используя переменную-член с тем же именем свойства для хранения значения (или otherVarName
, если вы используете синтаксис в комментариях).
Наряду с @synthesize
вы все равно можете переопределить один из методов получения / установки, определив свой собственный. Соглашение об именах для этих методов: setPropertyName:
для установщика и propertyName
(или getPropertyName
, не стандартное) для получателя. Другое все равно будет сгенерировано для вас.
В вашей строке @property
вы можете определить количество атрибутов в скобках для свойства, которое может автоматизировать такие вещи, как безопасность потоков и управление памятью. По умолчанию свойство является атомарным, то есть компилятор обернет @synthesiz
ed вызовы get / set соответствующими блокировками для предотвращения проблем параллелизма. Вы можете указать атрибут nonatomic
, чтобы отключить это (например, на iPhone вы хотите, чтобы большинство свойств по умолчанию были nonatomic
).
Существует 3 значения атрибута, которые управляют управлением памятью для любых @synthesized
сеттеров. Первый - retain
, который автоматически отправит release
старым значениям свойства и retain
новым значениям. Это очень полезно.
Вторым является copy
, который будет копировать любые переданные значения, а не сохранять их. Рекомендуется использовать copy
для NSString, потому что вызывающая сторона может передать NSMutableString и изменить его из-под вас. copy
создаст новую копию ввода, к которой имеют доступ только вы.
Третий - assign
, который выполняет прямое назначение указателя без вызова сохранения / освобождения старого или нового объекта.
Наконец, вы также можете использовать атрибут readonly
, чтобы отключить установщик для свойства.