Objective-C性质与综合逻辑

Objective-C性质与综合逻辑,objective-c,properties,Objective C,Properties,实例变量的实际名称是什么,比如说topSpeed,正如斯坦福大学关于Objective-C和iOS开发的讲座中提到的那样 代码如下: @property (nonatomic) double topSpeed; 看看这段代码,我会认为我已经在类中定义了一个变量topSpeed。 我不明白为什么它会自动声明与变量名相同的getter方法-topSpeed 另一个问题是我们何时使用 @synthesize topSpeed = _topSpeed 如果我们看看@synthesis将产生什么: -

实例变量的实际名称是什么,比如说topSpeed,正如斯坦福大学关于Objective-C和iOS开发的讲座中提到的那样

代码如下:

@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
属性

  • 这是一种语法糖,可以让您键入更少的单词

  • 与java/c++不同,在obj-c中不能访问类的变量。你只能称之为方法
  • @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)中创建一个属性。