1

私は以下のようにプロパティを宣言しました。私のウェブでの読みから、私も以下のように合成すべきかどうかは明らかではありません。私は2つの異なるアプローチのためにブログ投稿をサポートするのを見てきました。

@property (assign, nonatomic) CGFloat someFloat;

次に、実装では:

@synthesize someFloat = _someFloat;

私はいくつかの場合にも見ました:

@synthesize someFloat;

読んでみると、「someFloat」はプロパティ名であり、「_someFloat」は合成によって作成されていることがわかります。ですから、私は最初の方法が正しいという印象を受けています。しかし、私は問題なく2番目のアプローチを使用しました。そして、私は他のコードやブログで2番目のアプローチを見てきました。

誰かが正しい方法とその理由を教えてもらえますか?

4

2 に答える 2

3

一般的に、手動で書き込む必要は@synthesizeもうありません。あなたの例では、あなたが書くなら

@property (assign, nonatomic) CGFloat someFloat;

コンパイラは自動的にそれを合成します。これはあなたが書くのと同じです

@synthesize someFloat = _someFloat;

したがって、をself.someFloat使用して、実装ファイル内のivarを介してプロパティにアクセスしたり、ivarにアクセスしたりできます_someFloat

ただし、手動で次のように合成する場合

@synthesize someFloat;

コンパイラーは、...というタイトルのバッキングivarを自動的に作成しsomeFloatます。これにより、ゲッターを介して変数にアクセスできますself.someFloat(つまり、[self someFloat]呼び出しと同等です)。

someFloatまたは、実装内のどこかを使用するだけでivarにアクセスできます...

一般に、このように合成することはお勧めしません。ゲッターを使用して変数にアクセスしようとしたときに、誤ってivarを使用する可能性が非常に高いためです。

ルールの例外

ただし、場合によっては、コンパイラーは変数の合成と混同されることがあります。たとえば、のサブクラスであるクラスがあるNSManagedObject場合でも、手動で記述する必要があり@synthesizeます(もちろん、実際にプロパティを合成したい場合は...おそらくそうではありません...)。

この理由は2つあります。(1)コンパイラはこれらのプロパティをまだ十分に理解していないようです(または、少なくとも私が作業した場合は理解していません)。(2)何度も実際には、サブクラスのプロパティは必要ありません...むしろ、代わりにプロパティを使用する必要があります(したがって、サブクラスマジックの要件に従って、実行時にゲッター/セッターが生成されます)。@synthesizeNSManagedObject@dynamicNSManagedObject

于 2013-02-18T02:50:32.507 に答える
1

ステートメントをスキップするだけ@synthesizeで、コンパイラは次の場合と同じものを生成します。

@synthesize someFloat = _someFloat;
于 2013-02-18T02:50:47.487 に答える