7

現在、iOS 開発の方法を学び始めており、現在、Apress の iOS6 入門書を執筆中です。

第 2 章には、2 つのボタンとラベルを表示する簡単なチュートリアルがあり、ボタンを押すと、どちらが押されたかがラベルに表示されます。

チュートリアルを完了しましたが、答えが見つからない 1 つの疑問が生じました。

違いが生じる場合に備えて、チュートリアルでは 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;は、プロパティに正しくアクセスしていなかったためです。self.プロパティ (およびそのセッター/ゲッター) は self のインスタンスに属しているため、生成されたゲッター/セッターを介してそれにアクセスするには、先頭に追加する必要があります。したがって、代わりにself.statusLabel.text = plainText;

機能した理由_statusLabelは、これがプロパティの値を保持する基になる変数であるためです。この方法で変数にアクセスすると、生成されたセッター/ゲッターを回避しています。これは、プロパティ定義の一部として指定したキーワードを尊重するため、通常は を使用する必要があります (生成されたセッターとゲッターが基になるインスタンス変数の周りにブロックを正しく配置するため、キーワードself.propertyNameを使用する場合が良い例です)。atomic@synchronized

最近のバージョンの Xcode では、プロパティを手動で合成しない場合、先頭にアンダースコアを付けて変数名を作成します (以前は手動で合成する必要がありましたが、これは問題ありません)。を使用して、必要に応じて独自の基になる変数名を定義できます@synthesize statusLabel = m_statusLabelm_statusLabelこれは、代わりにを使用してアクセスできることを意味します_statusLabel。差し迫った必要がない限り、通常はこれを行う必要はありません。Apple は先頭にアンダースコアを使用することを提案しています。

コードのこの時点では、生成されたセッター/ゲッターが完全ではない可能性があるため、メソッドを初期化するとき、およびメソッドの割り当てを解除するときに、基になる変数を使用する必要があります。

于 2013-02-08T11:14:52.917 に答える