Когда я должен @synthesize
явно добавить в свой код?
Как правило, если это требуется: вы, вероятно, никогда не попадете в дело, где это необходимо.
Однако есть один случай, который может вам пригодиться.
Предположим, вы пишете как собственный метод получения, так и метод установки, но хотите, чтобы его поддерживала переменная экземпляра. (Для атомарного свойства это так же просто, как потребность в настраиваемом сеттере: компилятор напишет геттер, если вы укажете сеттер для одноатомного свойства, но не для атомарного свойства.)
Учти это:
@interface MyObject:NSObject
@property (copy) NSString *title;
@end
@implementation MyObject
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
Это не сработает, потому _title
что не существует. Вы указали и геттер, и сеттер, поэтому Xcode (правильно) не создает для него переменную резервного экземпляра.
У вас есть два варианта, как заставить его существовать. Вы можете изменить на @implementation
это:
@implementation MyObject {
NSString *_title;
}
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
Или измените его на это:
@implementation MyObject
@synthesize title = _title;
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
Другими словами, хотя для практических целей синтезировать никогда не требуется *, его можно использовать для определения переменных экземпляра, поддерживающих свойства, когда вы предоставляете геттер / сеттер. Вы можете решить, какую форму здесь вы хотите использовать.
Раньше я предпочитал указывать переменную экземпляра в @implementation {}
, но теперь думаю, что @synthesize
маршрут - лучший выбор, поскольку он удаляет избыточный тип и явно связывает поддерживающую переменную со свойством:
- Измените тип свойства, и тип переменной экземпляра изменится.
- Измените его квалификатор хранилища (например, сделайте его слабым вместо сильного или сильным вместо слабого), и квалификатор хранилища изменится.
- Удалите или переименуйте свойство, и
@synthesize
компилятор выдаст ошибку. Вы не получите случайных переменных экземпляра.
* -Я знаю один случай, когда это было необходимо, относящееся к разделению функциональности по категориям в нескольких файлах. И я не удивлюсь, если Apple исправит это или даже уже исправит.