2012-04-18 11 views
0

可能性の重複:
When do I need to have both iVar and a property?なぜ私はダブルプロパティ宣言を見続けるのですか?

私はObjective-Cのコードに次のように見ておきます。

@interface Contact : RKObject { 
    NSNumber* _identifier; 
    NSString* _name; 
    NSString* _company; 
} 

@property (nonatomic, retain) NSNumber* identifier; 
@property (nonatomic, retain) NSString* name; 
@property (nonatomic, retain) NSString* company; 

インターフェイスを持つブロックの内側のビットも必要なのはなぜですか? @synthesizeを使うのではなく?

@interface

答えて

3

内部ブロックは以下の3つの要素は、propertiesであるが、それはあなたのためにアイバーズアクセサ(ゲッターとセッター)は、あなたのクラスのivarsです。

あなたは一般的に、アクセサ (ゲッター/セッター)メソッドのペアを通じて(その 属性との関係の意味での)オブジェクトのプロパティにアクセスします。アクセサメソッドを使用することで、カプセル化の原則である を遵守します。 getter/setterペアの動作と下位の 状態管理の動作を厳密に制御しながら、APIのクライアントは 実装の変更から保護されたままです。

アクセサーメソッドを使用することには大きな利点がありますが、アクセサメソッドの作成は面倒なプロセスです。さらに、 の側面では、アクセサのメソッドがスレッドセーフかどうか、または新しい値が設定されたときにコピーされるかどうかなど、APIのコンシューマにとって重要なプロパティは、 のように隠されています。

宣言されたプロパティアドレス以下 の機能を提供することにより、これらの課題:

  • プロパティ宣言は、アクセサメソッドがどのように動作するかの明確な、明示的な仕様を提供します。
  • コンパイラは、宣言で指定した仕様に従って、アクセサメソッドを合成できます。
  • プロパティは識別子として構文的に表現され、スコープされるため、コンパイラは宣言されていないプロパティの使用を検出できます。

リファレンス:博士のKAMELEONの答えを拡張https://developer.apple.com/library/mac/#documentation/cocoa/conceptual/objectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW1

2

彼らは@synthesizeラインで明示的に宣言することができるよう、アイバーズが、この場合には不要です。たとえば、@synthesize name = _nameは、.hでiVarを宣言するのと同じです(この構文ではプロパティが必要です)。どちらももう一方よりもOKではなく、もう少し効率的なコーディングです。

+0

これは、64ビットアプリケーションがオプションである限り、利用可能ではありませんでしたか?それとも、イベントを混ぜるのですか? –

+0

@ uddo、私は正しいと信じています。 Snow Leopard x64およびiOS 3私たちが.hで宣言されていないiVarsを残すことが許されたのは初めてでした。 – CodaFi

+2

64ビットアプリケーションに直接接続するのではなく、新しい「現代的な」Objective-Cランタイムに[非壊れやすい象牙](http://cocoawithlove.com/2010/03/dynamic-ivars-solving- fragile-base.html)(そして、[Greg Parkerの投稿](http://www.sealiesoftware.com/blog/archive/2009/01/27/objc_explain_Non-fragile_ivars.html)を参照) - 因果関係はありません。同時に導入されました。 @スド –

関連する問題