【问题标题】:synthesizing properties with trailing underscore [duplicate]用尾随下划线合成属性[重复]
【发布时间】:2014-04-14 00:25:06
【问题描述】:

我正在学习使用 XCode 4 的 Lynda.com OCUnit 测试教程。在其中一个演示中,它会像这样在 Location.m 文件中合成属性

#import "Location.h"

@implementation Location

@synthesize locationManager=locationManager_;
@synthesize speed=speed_;

属性有一个尾随下划线。在我遵循的其他教程(例如斯坦福 iOS 课程)中,合成属性通常以实例变量的下划线为前缀。

.h 文件中创建属性时,没有下划线。

@property (nonatomic, strong) CLLocationManager *locationManager;
@property float speed;

为什么合成语句中的尾随下划线?

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    通过写作

    @synthesize locationManager=locationManager_;
    

    您正在定义一个 ivar locationManager_ 来备份您的财产。

    所以,对于您仍然使用的属性

    self.locationManager
    

    但是,ivar,该属性的“后面”现在称为:locationManager_

    【讨论】:

    • 我认为在最后加上下划线是个坏主意,因为它会让人更有可能在应该访问属性时意外使用 ivar,因为自动完成可以更容易地自动完成以这种方式到 ivar。这就是为什么在开头使用下划线(默认行为)是更受欢迎的原因。不是对您的回答的批评,因为问题也是如此,这只是一个评论。 :)
    • @Gavin:我理解你的评论,好的 :)。我自己很少使用 ivars,更喜欢始终使用 self.propertyName 来保持一致性(我知道在初始化程序中极少数情况下你应该更喜欢使用 ivars,但到目前为止我一直在这样做)
    • 我也几乎从不直接使用 ivars,并且非常喜欢使用属性。我将直接使用 ivars 的极少数情况通常是在紧密的循环中或在代码的性能非常关键的部分中。否则,与重绘屏幕之类的开销相比,开销是最小的。
    • @Gavin: nb: 似乎苹果不鼓励在 init 方法中使用属性...stackoverflow.com/questions/4091062/…
    【解决方案2】:

    @synthesize 允许您指定 ivar 的名称。该属性名为locationManager,但ivar 名为locationManager_

    【讨论】:

    • 你所说的“支持字段”是Objective-C中的“ivar”。
    • 有点迂腐,但是是的,你是对的。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 2012-09-13
    • 2011-07-24
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 2013-05-21
    相关资源
    最近更新 更多