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

Don*_*rty 7 cocoa-touch objective-c ios automatic-ref-counting ios6

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

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

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

本教程使用ARC(自动引用计数),以防万一.

这是代码,

头文件:

#import <UIKit/UIKit.h>

@interface MTMViewController : UIViewController


@property (weak, nonatomic) IBOutlet UILabel *statusLabel;


- (IBAction)buttonPressed:(UIButton *)sender;

@end
Run Code Online (Sandbox Code Playgroud)

和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
Run Code Online (Sandbox Code Playgroud)

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

statusLabel.text = plainText;
Run Code Online (Sandbox Code Playgroud)

而不得不改为:

_statusLabel.text = plainText;
Run Code Online (Sandbox Code Playgroud)

当我完成这个代码编译并运行良好,我试图找出为什么发生这种情况,通过回顾教程,看看我错过了什么,但我没有看到任何东西.

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

WDU*_*DUK 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可能不完整.

  • `@ synthesize`是在最新版本的Xcode中自动完成的,你不需要自己动手(如果必须,你会知道,但使用不同的底层变量名).我个人建议在任何地方使用`self.property`,除了`init`和`dealloc`方法,你应该使用`_property`. (2认同)