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可能不完整。