繁体   English   中英

Objective-C属性和综合逻辑

[英]Objective-C property and synthesize logic

什么是实例变量的实际名称,比如topSpeed,来自斯坦福大学关于Objective-C和iOS开发的讲座?

这是代码:

@property (nonatomic) double topSpeed;

看看这段代码我会认为我在类中定义了一个变量topSpeed。 我无法理解为什么它会自动声明名称与变量名称相同的getter方法 - topSpeed?

另一个问题是我们何时使用

@synthesize topSpeed = _topSpeed

如果我们看一下@synthesize会产生什么:

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


- (double) topSpeed
{
   return _topSpeed;
}

什么是_topSpeed,什么是topSpeed? 我已经声明了一个变量topSpeed,而不是_topSpeed。 如果我不使用属性变量名是什么怎么办?

在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和一个名为setTopSpeed的getter:和topSpeed,它带有一个名为topSpeed的实例变量(由编译器创建)来存储该值。 @synthesize topSpeed = _topSpeed;背后的想法@synthesize topSpeed = _topSpeed; 是实例变量名称是_topSpeed但访问者名称仍然是-setTopSpeed:-topSpeed 这有助于代码可读性,因为在您的代码中说self.topSpeed或topSpeed之间可能存在混淆(第一个调用访问器,第二个调用ivar)。 _topSpeed将自己与普通变量区分开来,并且当你调用self.topSpeed(访问者)和_topSpeed(ivar)时也会使它显式化。 Apple正在转向这种下划线语法,所以不要认为它已经灭绝,因为它恰恰相反。 更新:(见汤米的评论)

它还有助于变量命名冲突。 如果你必须实现setTopSpeed:你自己看起来像这样:

- (void)setTopSpeed:(double)topSpeed {
    _topSpeed = topSpeed; // _topSpeed makes it obvious it's an ivar
}
  1. 它是一种语法糖 ,让你输入更少的单词。
  2. java / c ++ 不同 ,在obj-c中,您无法访问类的变量。 你只能调用It的方法。
  3. @synthesize topSpeed = _topSpeed意味着您需要一个名为_topSpeed的变量,并且具有名为topSpeed和setTopSpeed的Accessors。
  4. @property (nonatomic) double topSpeed; 不是纯变量声明,它也会声明Accessors。 类Foo的纯变量将如下所示:

    @interface Foo:NSObject {double topSpeed; }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM