Коли слід @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
Іншими словами, хоча синтезувати для практичних цілей ніколи не потрібно *, він може бути використаний для визначення змінних екземпляра, що підтримують властивості, коли ви надаєте getter / setter. Ви можете вирішити, яку форму тут ви хочете використовувати.
Раніше я віддавав перевагу вказівці змінної екземпляра в @implementation {}
, але зараз я вважаю, що @synthesize
маршрут є кращим вибором, оскільки він видаляє надлишковий тип і явно прив'язує змінну-резерв до властивості:
- Змініть тип властивості, а тип змінної екземпляра зміниться.
- Змініть його кваліфікатор зберігання (наприклад, зробіть його слабким замість сильного або сильним замість слабкого), і кваліфікатор зберігання змінюється.
- Видаліть або перейменуйте властивість, і програма
@synthesize
створить помилку компілятора. Ви не отримаєте збиті змінні екземпляра.
* - Я знаю один випадок, коли це було необхідно, стосовно розподілу функціональних можливостей між категоріями у декількох файлах. І я не був би здивований, якщо Apple це виправить, або навіть вже зробить.