@synthesize 幕后
@synthesize behind the scenes
当我们创建一个 属性 并为其定义一个 synthesize 时,编译器会自动创建 getter 和 setter 方法,对吗?
现在,如果我执行这个命令:
@property(nonatomic) int value;
@synthesize value;
value = 50;
会发生什么:
编译器将值“50”保存在 属性?
property (nonatomic) int value; // Here is the stored value 50!
或者编译器在后台创建一个与 属性 同名的变量,如下所示:
interface myClass: NSObject {
int value; // Here is the stored value 50!
}
实际发生了什么,上面列出的备选方案是正确的吗?
可能是语义,但属性不再需要 @synthesize
。编译器会自动完成。
但是为了回答您的问题,编译器创建了一个实例变量来存储 属性 的值。
@property (nonatomic, assign) NSInteger value;
// an instance variable NSInteger _value; will be created in the interface.
如果您需要在不通过 属性 的情况下访问它,您可以在自己的代码中使用实例变量。这在覆盖 setter 时很常见,例如:
- (void)setValue:(NSInteger)value {
_value = value;
// custom code
}
当我们创建一个 属性 并为其定义一个 synthesize 时,编译器会自动创建 getter 和 setter 方法,对吗?
现在,如果我执行这个命令:
@property(nonatomic) int value;
@synthesize value;
value = 50;
会发生什么:
编译器将值“50”保存在 属性?
property (nonatomic) int value; // Here is the stored value 50!
或者编译器在后台创建一个与 属性 同名的变量,如下所示:
interface myClass: NSObject {
int value; // Here is the stored value 50!
}
实际发生了什么,上面列出的备选方案是正确的吗?
可能是语义,但属性不再需要 @synthesize
。编译器会自动完成。
但是为了回答您的问题,编译器创建了一个实例变量来存储 属性 的值。
@property (nonatomic, assign) NSInteger value;
// an instance variable NSInteger _value; will be created in the interface.
如果您需要在不通过 属性 的情况下访问它,您可以在自己的代码中使用实例变量。这在覆盖 setter 时很常见,例如:
- (void)setValue:(NSInteger)value {
_value = value;
// custom code
}