在对象 - 发展的早期,还是在今天你宣布像这样在你的类的头文件中的变量:
@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:和极速用一个实例变量称为极速(由编译器生成)来存储值。 @synthesize topSpeed = _topSpeed;
背后的想法是实例变量名称将为_topSpeed
,但访问者名称仍将为-setTopSpeed:
和-topSpeed
。这有助于代码的可读性,因为当你在代码中声明self.topSpeed或topSpeed(第一个调用访问器的时候,第二个是ivar)时可能会出现混淆。 _topSpeed区别于普通变量,并且在调用self.topSpeed(访问器)和_topSpeed(伊娃)时也会使其变得明确。苹果也正在转向这种下划线语法,所以不要以为它会灭绝,因为它恰恰相反。更新:(请参阅汤米的评论)
它也有助于变量命名冲突。如果你不得不实施setTopSpeed:自己会是这个样子:
setTopSpeed:(double)topSpeed {
_topSpeed = topSpeed; // _topSpeed makes it obvious it's an ivar
}
http://stackoverflow.com/questions/3521254/prefixing-property-names-with-an-underscore-in-objective-c – Saurabh 2012-03-03 07:36:08