Когда вы @synthesize свойство типа объекта в цели c, компилятор сгенерирует два скрытых метода для этой переменной экземпляра. Таким образом, когда вы ссылаетесь на myObject.myString
, будет возвращен не только указатель _myString, но и будет вызван сгенерированный метод - (NSString*) myString
. Аналогично, если вы назначите что-то свойству: myObject.myString = @"foo";
, оно будет скомпилировано в [myObject setMyString:@"foo"];
.
Значения - (NSString*) myString
и - (void) setMyString:(NSString*) theString
зависят от ключевых слов, которые вы указали при объявлении свойства. Наиболее распространенным является assign
, который просто назначает указатель, который вы даете:
- (void) setMyString:(NSString*) theString
{
_myString = theString;
}
- (NSString*) myString
{
return _myString;
}
Это не слишком сильно отличается от объявления _myString публичной переменной, но это более явный способ сказать, что к этой переменной можно получить прямой доступ извне.
В свою очередь, retain
генерирует аналогичный метод установки (метод получения будет таким же):
- (void) setMyString:(NSString*) theString
{
[theString retain];
[_myString release];
_myString = theString;
}
Вы можете видеть, что это заботится об управлении памятью объекта, который вы передали в свойство. Другими словами, вы можете быть уверены, что объект не будет освобожден до тех пор, пока он не будет у вас в собственности, поэтому вам не придется retain
вручную, когда вы переходите в собственность. Это делает гораздо удобнее написание кода, который управляет памятью без утечек. Обратите внимание, что в dealloc вам все еще нужно применить nil к вашему имуществу, чтобы освободить последний сохраненный объект.
Другая категория свойств, когда их данные поступают не из переменных экземпляра, а из какого-либо другого источника данных, например базы данных. Автоматически сгенерированные свойства управляемых объектов базовых данных, например, работают так.
Наконец, вы также можете определить свои собственные методы получения и установки. Хорошая идея, например, написать оболочку свойства вокруг некоторых часто используемых NSUserDefaults
настроек, которые облегчат его доступ:
@interface Bar
@property (nonatomic, assign) NSString* foo;
@end
@implementation Bar
- (void) setFoo:(NSString *)theFoo
{
[[NSUserDefaults standardUserDefaults] setObject:theFoo
forKey:@"settings.foo"];
}
- (NSString*) foo
{
return [[NSUserDefaults standardUserDefaults]
stringForKey:@"settings.foo"];
}
@end
myBar.foo = @"foobar"; // automatically persisted between application runs
Прочтите также: Расширенное управление памятью и Объявленные свойства в задаче C