2013-02-08 13 views
7

分単位でiOSの開発がどのように進んでいるかを知り始めています。現在、私が働いているApressの最初のIOS6の本を持っています。iOS - iOSチュートリアルを開始 - 変数の前に下線を引く?

第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; 

、代わりにそれを変更しなければなりませんでした私は何も見ませんでした。

誰も、なぜ本のコードがコンパイルされなかったのか、なぜ変数の先頭にアンダースコアを追加しなければならなかったのか説明できますか?これは正しいですか、私は何か間違ったことをしましたか?

+1

ゲッターとセッターを生成するための "@synthesize"の概念があります。 "@synthesize"でそのプロパティを宣言すると、同じ名前で直接アクセスすることができます。ちょうど参照のために。 –

+0

@Jennis私は本当にそれをお勧めしません。それは、基礎となる変数にアクセスしているのか、生成されたgetter/setterを使用しているのかを混乱させます。さまざまなアクセス方法に異なる名前を付けることで、コードが何をしているのか、その根拠が明確になります。 '@ synthesisize'がプロパティに対して必須である旧バージョンのXcodeを使用している場合、' @synthesize statusLabel = _statusLabel'の形式をお勧めします。 – WDUK

答えて

11

理由は、statusLabel.text = plainText;が正しくプロパティにアクセスしていなかったためです。生成されたゲッタ/セッタを介してアクセスするには、プロパティ(およびそのセッタ/ゲッタ)がselfのインスタンスに属しているので、self.をその前に追加する必要があります。したがって、代わりにself.statusLabel.text = plainText;

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

Xcodeの最近のバージョンでは、プロパティを手作業で合成しないと、変数名の先頭にアンダースコアが付いています(これはOKです)。は手作業でに合成されていました。必要に応じて、独自の基本変数名を定義することができます。@synthesize statusLabel = m_statusLabelを使用します。つまり、_statusLabelの代わりにm_statusLabelを使用してアクセスできます。必要性が非常に高い場合を除いて、通常これを行う必要はありません。 Appleは、先頭にアンダースコアを使用することを提案しています。

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

+0

優秀な方、素晴らしい情報をいただきありがとうございます。だから私は本のコードがこの場合に間違っていると推測しており、本の将来の章を読むときにはself.propertyを使うべきですか? –

+1

あなたが投稿したコードが本のようなものなら、はい、本は間違っています。 'self.statusLabel'を使うべきです。彼らがどこに逃げたのか分かります。私が人々が手動でプロパティを合成しなければならないと言いましたが、単に '@synthesize statusLabel'を使うことができます。これは 'statusLabel'という名前の基礎となる変数を作成します。これは生成されたセッター/ゲッターを使用しているかどうかを訓練されていない目に混乱させます。 – WDUK

+0

実際には、本にはないものの、ソースコードの中にある本の中には、行@synthesize statusLabelというものがあります。あなたが言うことである.mファイルで。私はまだちょっと混乱していますが、self.propertyアプローチや[@]合成プロパティアプローチを使う方が良いでしょうか? –

関連する問題