2011-09-21 10 views
8

@propertyは.hファイル内のgetterとsetterを宣言し、@synthesizeは.mファイル内のgetterとsetterを実装しています。さらに、@synthesizeを使用する代わりに、getterとsetterの独自の実装を記述することも可能です。Objective-C:実装なしの@property宣言(@synthesize)

私たちは常にsetter/getterを実装する必要がある場合、なぜそれを追加宣言する必要がありますか? @propertyは私にとって意味のある冗長性とバグの原因であるようです。

@propertyを宣言しても@synthesizeまたは手動で実装するのを忘れた場合はどうなりますか? @synthesizeを使用して@property宣言を忘れると、何が起こりますか?

答えて

26

Xcode 4.4以降、プロパティはデフォルトで合成されるので、冗長で、Appleは@propertyと@synthesizeの両方を書く必要がなくなり、@propertyを使用するだけです。

+0

彼らはこれを追加していいですね。応答のためにありがとう –

+8

プロパティと合成を一緒に使用する必要がある場合がまだあります。コンパイラは、プロパティ名とアンダースコア接頭辞を使用してivarを作成します。 ivar _propertynameがプライベートインスタンス変数と衝突する場合、それを新しいivarに合成する必要があります。たとえば、UIToolbarをサブクラス化して、それをdelegateするプロパティを宣言すると、UIToolbarにプライベートインスタンス変数id _delegateが含まれているため、エラーが発生します。これを解決するには、 '@synthesize delegate = _mydelegate;'を使用します。 – lolol

4

@プロパティを宣言して実装するのを忘れた @synthesizeまたは手動ではどうなりますか? @synthesizeを使って、 @property宣言を忘れると何が起こるのですか?

あなたはそれを試してみませんか?アクセサを合成するのを忘れた場合や、独自のプラグインを提供しない場合、コンパイラは警告します。 (警告をエラーとして処理するように設定している場合、これは良い考えですが、警告を見逃すことは不可能です)。2番目のケースでは通常、コンパイルエラーが発生します。

私たちは常にsetter/getterを実装する必要がある場合、なぜ を追加して宣言する必要がありますか? @propertyは、 私とバグのソースに意味的な冗長性があるようです。

は、簡単に言えば、 @propertyは、プロパティの宣言であると @synthesizeは一つの可能​​な実装です。 1つはヘッダー(パブリックインターフェイスの説明)に属し、もう1つは実装ファイルに属します。このようにしないとどうしますか? .hファイルで下記の持つ

6

@property (retain, nonatomic) NSString* userName; 

.Mに.hファイルに

-(NSString*)userName; 

-(void)setUserName:(NSString*)userName; 

ため

@synthesizeシンタックスシュガーである、独自のために残すためのシンタックスシュガーでありますプロパティの宣言で指定されている通りretainnonatomicなどを尊重して実装してください。

適切なゲッター、セッターの署名を.hファイルに指定していても、out @ propertiesで合成することはできません。

@synthesizeのままにして、独自のゲッターとセッターを実装することができます。

@synthesizeとカスタムゲッタセッターの両方を実行した場合、実行時は実装を尊重し、同じものを呼び出します。

+0

素敵な説明 – onmyway133

2

@synthesizeの代わりに@dynamicを使うこともできますが、これは非常にまれなことです。 @dynamicは、基本的には、あなたがであることをコンパイラに伝えています。ゲッターとセッターへの呼び出しは、実行時に自分自身で行うか、いくつかのObjective Cランタイムの特別な機能

+0

「何とか」に興味があります。私はドットスタイルのプロパティを辞書で元に戻し、全く失敗したかったのです。おそらく問題の果物。 –

関連する問題