2012-03-03 43 views
13

根据斯坦福大学关于Objective-C和iOS开发的演讲,什么是实例变量的实际名称,例如topSpeed?Objective-C属性和综合逻辑

下面是代码:

@property (nonatomic) double topSpeed; 

看着这个代码,我会认为我已经定义的类变量极速。 我不明白为什么它会自动声明getter方法的名称与变量名称相同 - topSpeed?

另一个问题是,当我们使用

@synthesize topSpeed = _topSpeed 

如果我们再看一下@synthesize将产生:

- (double) setTopSpeed:(double)speed 
{ 
    _topSpeed = speed; 
} 


- (double) topSpeed 
{ 
    return _topSpeed; 
} 

这到底是怎么_topSpeed,什么是极速?我已经声明了一个变量topSpeed,而不是_topSpeed。如果我不使用财产,那么变量名称会是什么?

+0

http://stackoverflow.com/questions/3521254/prefixing-property-names-with-an-underscore-in-objective-c – Saurabh 2012-03-03 07:36:08

回答

36

在对象 - 发展的早期,还是在今天你宣布像这样在你的类的头文件中的变量:

@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 
} 
+11

......现在'@synthesize topSpeed = _topSpeed'被相关的@ @ property所隐含;实际上并不需要包含它。你可以包含一个替代的'@ synthesize'(例如,指定一个没有前导下划线或与属性完全无关的实例变量名)或者自己编写getter/setter(例如,如果你想调用,比如''[自己setNeedsLayout]当属性改变时),但如果你不提供任何东西,那么编译器会推断通常的'@ synthesize'。 – Tommy 2012-12-27 01:06:52

+0

代码中的_self.topSpeed或topSpeed(这是两个不同的东西)_这两个不同的东西是因为'topSpeed'是实例变量,它的值由'self.topSpeed'属性返回? – Trisped 2013-05-09 23:53:01

+0

@Trisped我更新了这一行。现在应该清楚了。 – 2013-06-06 23:21:56

0

对于第一个问题,答案是“命名约定”。所以它只是一个命名约定。如果你想访问topSpeed变量,“get”部分不重要 - 比如[car topSpeed][car getTopSpeed]更容易阅读。至于第二个问题,我不确定,但我相信你通过变量_topSpeed访问topSpeed属性。

3
  1. 这是一个语法糖,让你输入较少的单词。
  2. 不像 java/C++,在obj-c中,你不能访问类的变量。你只能调用它的方法。
  3. @synthesize topSpeed = _topSpeed表示您想要一个名为_topSpeed的变量,并具有名为topSpeed和setTopSpeed的访问器。
  4. @property (nonatomic) double topSpeed;不是一个纯变量声明,它也会声明访问器。 Foo类的纯变量将如下所示:

    @interface Foo:NSObject {0} {0} {0} }

+1

“与java/C++不同,在obj-c中,不能访问类的变量。”如果你指的是实例变量,你可以直接在Objective-C中访问它们,如果它们是'@ public'。 – 2012-03-03 08:43:44