Objective-C性质与综合逻辑
实例变量的实际名称是什么,比如说topSpeed,正如斯坦福大学关于Objective-C和iOS开发的讲座中提到的那样 代码如下:Objective-C性质与综合逻辑,objective-c,properties,Objective C,Properties,实例变量的实际名称是什么,比如说topSpeed,正如斯坦福大学关于Objective-C和iOS开发的讲座中提到的那样 代码如下: @property (nonatomic) double topSpeed; 看看这段代码,我会认为我已经在类中定义了一个变量topSpeed。 我不明白为什么它会自动声明与变量名相同的getter方法-topSpeed 另一个问题是我们何时使用 @synthesize topSpeed = _topSpeed 如果我们看看@synthesis将产生什么: -
@property (nonatomic) double topSpeed;
看看这段代码,我会认为我已经在类中定义了一个变量topSpeed。
我不明白为什么它会自动声明与变量名相同的getter方法-topSpeed
另一个问题是我们何时使用
@synthesize topSpeed = _topSpeed
如果我们看看@synthesis将产生什么:
- (double) setTopSpeed:(double)speed
{
_topSpeed = speed;
}
- (double) topSpeed
{
return _topSpeed;
}
这里什么是最高速度?什么是最高速度?我已经声明了一个变量topSpeed,而不是_topSpeed。如果我不使用属性,变量名会是什么?对于第一个问题,答案是“命名约定”。因此,这只是一种命名约定。如果要访问
topSpeed
变量,则“get”部分并不重要-例如[car topSpeed]
比[car getTopSpeed]
更易于读取。至于第二个问题,我不确定,但我相信您可以通过变量\u topSpeed
访问topSpeed
属性
@synthesis-topSpeed=\u-topSpeed
表示您需要一个名为\u-topSpeed的变量,并且具有名为topSpeed和setTopSpeed的访问器@属性(非原子)双上速度
不是纯粹的变量声明,它还将声明访问器。类Foo的纯变量如下所示:
@接口Foo:NSObject{
双上速度;
}在Obj-C的早期和今天,您在类的头文件中声明了如下变量:
@interface MySubclass : NSObject {
int varName;
}
然后必须手动创建setter和getter方法来访问类外部的变量。为了帮助处理内存管理(对对象有用),苹果在Obj-C2.0中引入了属性,它允许您为给定变量定义访问器。您可以说一个变量将具有某些属性(例如保留或复制一个值、具有备用setter或getter名称等),您定义如下:
@property (someAttributes) int varName;
然后在@implementation中,您可以用给定的属性@synthesis这些属性,编译器将为您的变量生成setter和getter方法
@synthesize varName; // Generates -setVarName: and -varName for you
现在,我们的想法是,您可以不再在{}部分实现实例变量,而只声明一个属性和一个属性。如果我们只是说
@property (nonatomic) double topSpeed;
@synthesize topSpeed;
是一个名为setTopSpeed:的setter和getter,topSpeed带有一个名为topSpeed(由编译器创建)的实例变量来存储值。@synthesis-topSpeed=\u-topSpeed
表示实例变量名称将为\u 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
}
“与java/c++不同,在obj-c中您不能访问类的变量。”如果您指的是实例变量,如果它们是
@public
,您可以在Objective-c中直接访问它们。。。。现在,相关的@属性
暗示了@synthetic topSpeed=_topSpeed
;实际上没有必要包括它。您可以包含一个可选的@synthesis
(例如,指定一个没有前导下划线的实例变量名,或者只是与属性完全无关),或者自己编写getter/setter(例如,如果您想在属性更改时调用[self-setNeedsLayout]
)但是如果您不提供任何内容,编译器将推断出通常的@synthesis
.self.topSpeed或代码中的topSpeed(这是两个不同的东西)是两个不同的东西,因为topSpeed
是实例变量,其值由self.topSpeed
属性返回?我不明白,即使它不是一个属性,也是一个实例变量。我们不能设置并获取实例变量的值吗?我的意思是,我们如何设置和获取实例变量的值?@asma22如果您在实现(.m)中声明实例变量,那么您只能在该类中访问。如果要使其可公开访问,则需要在接口(.h)中创建一个属性。