2009-04-30 6 views
3

私が理解しているように、@ synthesesizeは実際にGettersとSettersを生成しています。しかし、@propertyは何をしていますか?クールな@合成マジック関数のパラメータを設定するだけですか?@propertyと@synthesizeの違いは何ですか?

- (float)value; 
- (void)setValue:(float)newValue; 

それはあなたのクラスがphisicaly CREATEこの方法

@synthesizeを持っていることを、他のクラスのための情報を入手:

答えて

7

あなたが

@property float value; 

はと等価であるヘッダファイルに@propertyを書きますクラス実装のこれらのメソッド

+1

これは全く同じではありません。@propertyを使用すると、ドット表記を使用することもできます。 object.value、object.value = 1.0f; – Elliot

9

@propertyは、名前をプロパティとして宣言します。これは、ドット構文(object.value)でアクセスできることを意味します。

@synthetizeは、ゲッターとセッターメソッドを作成するマクロと見ることができます。 @synthetizeが入力されていても、それらのメソッドをオーバーライドできることがわかります。

+0

しかし、いつものように宣言されたメソッドは、プロパティだけでなくドット構文を使ってアクセスできます(getterやsetter以外のものにはドット構文を使用することは絶対に勧められません)。そして、もっと重要なのは、@synthesizeを使用しないと、* any *メソッドではプロパティにアクセスできないということです。 @synthesizeを指定せずに@propertyを使用する場合は、getterメソッドとsetterメソッドを宣言するのとまったく同じですが、実装することはありません。 – andyvn22

4

@property

@synthesizeがそれらを実装ゲッターおよび/またはセッターを宣言します。

1

@synthesizeディレクティブは@propertyディレクティブで作成されたセッターとゲッターを実装するために必要であると誤解されていますが、そうではありません。 @synthesizeを指定せずに@propertyディレクティブを使用すると、セッター/ゲッターが生成され、ドット表記法を使用できるようになります。しかし、@synthesizeディレクティブを省略すると、コンパイラは対応するインスタンス変数の先頭にアンダースコアを付けて生成します。プロパティmyVarのインスタンス変数は_myVarになります。

先頭にアンダースコアを使用すると、プロパティとインスタンス変数を区別できる一般的な規則が使用されます。プロパティとインスタンス変数が同じ名前を共有することもよくあります。これはデフォルトで@synthesizeが行うことです。

+1

質問があった時にこれは戻っていませんでした。 – vikingosegundo

+0

また、何らかの理由ですべてのアクセサをオーバーライドすると、手動で '@ synthesize'しない限り、インスタンス変数は自動的に合成されません。 – Rob

関連する問題