我什么时候应该@synthesize
明确地添加到我的代码中?
通常,如果需要:您可能永远不会遇到需要它的情况。
不过,有一种情况您可能会发现它很有用。
假设您正在编写自定义 getter 和 setter,但想要一个实例变量来支持它。(对于原子属性,这就像想要一个自定义 setter 一样简单:如果您为单原子属性指定了一个 setter,编译器将编写一个 getter,但不是原子属性。)
考虑一下:
@interface MyObject:NSObject
@property (copy) NSString *title;
@end
@implementation MyObject
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
这行不通,因为_title
不存在。您已经指定了 getter 或 setter,因此 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
换句话说,尽管 synthesize 出于实际目的从来没有必要*,但当您提供 getter/setter 时,它可用于定义支持属性的实例变量。您可以在此处决定要使用哪种表格。
@implementation {}
过去,我倾向于在@synthesize
.
- 改变属性的类型,实例变量的类型就会改变。
- 更改其存储限定符(例如,将其设为弱而不是强或强而不是弱)并且存储限定符会更改。
- 删除或重命名属性,
@synthesize
将产生编译器错误。你不会得到杂散的实例变量。
*-我知道一种必要的情况,涉及在多个文件中跨类别拆分功能。如果 Apple 解决了这个问题,甚至已经解决了,我也不会感到惊讶。