7

我现在开始学习如何进行一些 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;

完成此操作后,代码编译并运行良好,我试图通过返回教程查看我是否遗漏任何内容但没有看到任何内容来弄清楚为什么会发生这种情况。

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

4

1 回答 1

11

失败的原因statusLabel.text = plainText;是因为您没有正确访问该属性。为了通过生成的 getter/setter 访问它,您需要预先self.添加它,因为属性(及其 setter/getter)属于 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 可能不完整。

于 2013-02-08T11:14:52.917 回答