iOS - 开始iOS教程 - 变量之前的下划线?

时间:2013-02-08 11:07:54

标签: ios objective-c cocoa-touch ios6 automatic-ref-counting

我开始学习如何在一分钟内开发一些iOS,而我目前正在开始使用Apress开始的IOS6书籍。

在第二章中,有一个简单的教程,显示两个按钮和一个标签,当按下按钮时,它会显示在标签上,按下了一个按钮。

我已经完成了教程,但它提出了一个我无法找到答案的问题。

本教程使用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

上面是它出现在书中的方式,但是当在Xcode中进行教程时,我无法使用以下行编译:

statusLabel.text = plainText;

而是必须将其更改为:

_statusLabel.text = plainText;

当我完成这个代码编译并且运行正常时,我试图通过回顾教程来弄清楚为什么会发生这种情况,看看我是否遗漏了什么,但我没有看到任何内容。

任何人都可以解释为什么书中的代码没有编译,为什么我必须在变量的前面添加下划线?这是正确的还是我做错了什么?

1 个答案:

答案 0 :(得分:11)

statusLabel.text = plainText;失败的原因是因为您没有正确访问该属性。为了通过生成的getter / setter访问它,您需要将self.添加到它,因为属性(及其setter / getters)属于self的实例。相反,它将是self.statusLabel.text = plainText;

_statusLabel工作的原因是因为这是保存属性值的基础变量。在以这种方式访问​​变量时,您正在绕过生成的setter / getter。通常,您应该使用self.propertyName,因为这将尊重您作为属性定义的一部分提供的关键字(如果您使用atomic关键字就是一个很好的示例,因为生成的setter和getter将正确在底层实例变量周围放置一个@synchronized块。

如果您不手动合成属性,Xcode的最新版本会创建带有前置下划线的变量名称(这是一件好事,以前人们 手动合成)。如果您愿意,可以使用@synthesize statusLabel = m_statusLabel定义自己的基础变量名称。这意味着您可以使用m_statusLabel代替_statusLabel来访问它。除非有迫切的需要,否则你通常不需要这样做; Apple建议使用前置下划线。

在初始化方法和解除分配方法时,您应该使用底层变量,因为在代码中此时生成的setter / getter可能不完整。