iOS – 开始iOS教程 – variables之前的下划线?

我开始学习如何在一分钟的iOS开发,我现在有Apress开始IOS6书,我正在努力。

在第二章中,有一个简单的教程来展示两个button和一个标签,当按下button时,标签上会显示哪个button被按下。

我已经完成了这个教程,但是提出了一个我找不到答案的问题。

本教程使用ARC(自动引用计数),以防有所作为。

这里是代码,

头文件:

#import <UIKit/UIKit.h> @interface MTMViewController : UIViewController @property (weak, nonatomic) IBOutlet UILabel *statusLabel; - (IBAction)buttonPressed:(UIButton *)sender; @end 

和m文件:

 #import "MTMViewController.h" @implementation MTMViewController - (IBAction)buttonPressed:(UIButton *)sender { NSString *title = [sender titleForState:UIControlStateNormal]; NSString *plainText = [NSString stringWithFormat:@"%@ button pressed.", title]; statusLabel.text = plainText; } @end 

以上是它在书中的performance,但是当在Xcode中做这个教程时,我无法用下面的代码来编译:

 statusLabel.text = plainText; 

而不得不将其更改为:

 _statusLabel.text = plainText; 

当我完成这个代码编译和运行良好,我试图找出为什么发生这个问题,回到教程,看看我是否错过了什么,但我什么也没有看到。

任何人都可以解释为什么书中的代码没有编译,为什么我不得不将下划线添加到variables的前面? 这是正确的还是我做错了什么?

原因statusLabel.text = plainText; 失败是因为您没有正确访问属性。 为了通过生成的getters / setter来访问它,你需要预先self. 因为财产(及其制定者/获得者)属于自我的实例。 所以相反,它会是self.statusLabel.text = plainText;

_statusLabel工作的原因是因为这是保存属性值的基础variables。 当以这种方式访问​​variables时,你正在规避生成的setter / getters。 一般来说,您应该使用self.propertyName ,因为这将尊重您作为属性定义的一部分提供的关键字(一个很好的例子是如果您使用atomic关键字,因为生成的setter和getter将正确放置@synchronized块底层的实例variables)。

如果你不手动合成你的属性(这是一件好事,以前人们不得不手动合成),Xcode的最新版本会创build带有下划线的variables名。 你可以使用@synthesize statusLabel = m_statusLabel来定义你自己的底层variables名称。 这意味着您可以使用m_statusLabel而不是_statusLabel来访问它。 除非有迫切需要,否则通常不需要这样做。 苹果build议使用前缀下划线。

在初始化方法和取消分配方法时,您应该使用基础variables,因为在代码中此时生成的setter / getters可能不完整。