在 Obj-C 的早期和今天,您在类的头文件中声明变量,如下所示:
@interface MySubclass : NSObject {
int varName;
}
然后您将不得不手动创建 setter 和 getter 方法来访问您的类之外的变量。为了帮助处理内存管理(对对象有用),Apple 在 Obj-C 2.0 中引入了属性,它允许您为给定变量定义访问器。您可以说一个变量将具有某些属性(例如保留或复制一个值,具有备用 setter 或 getter 名称等),您可以这样定义:
@property (someAttributes) int varName;
然后在您的@implementation 中,您可以使用给定的属性@synthesize 这些属性,编译器将为您的变量生成setter 和getter 方法。
@synthesize varName; // Generates -setVarName: and -varName for you
现在,今天的想法是,您可以不再在 {} 部分中实现实例变量,而只需声明一个属性和一个综合。如果我们只是说,我们会得到什么
@property (nonatomic) double topSpeed;
@synthesize topSpeed;
是一个 setter 和一个 getter,称为 setTopSpeed: 和 topSpeed,带有一个名为 topSpeed 的实例变量(由编译器创建)来存储值。 @synthesize topSpeed = _topSpeed; 背后的想法是实例变量名称将是 _topSpeed,但访问器名称仍将是 -setTopSpeed: 和 -topSpeed。这有助于代码的可读性,因为在代码中说 self.topSpeed 或 topSpeed 时可能会产生混淆(第一个调用访问器,第二个是 ivar)。 _topSpeed 将自己与普通变量区分开来,并且在您调用 self.topSpeed (访问器)与 _topSpeed (ivar)时也使其明确。苹果也在转向这种下划线语法,所以不要认为它会灭绝,因为它恰恰相反。更新:(见汤米的评论)
它还有助于解决变量命名冲突。如果你必须自己实现 setTopSpeed: 它看起来像这样:
- (void)setTopSpeed:(double)topSpeed {
_topSpeed = topSpeed; // _topSpeed makes it obvious it's an ivar
}