0

重複の可能性:
iVar とプロパティの両方が必要になるのはいつですか?

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 を使用する代わりですか?

4

2 に答える 2

3

内のブロック@interfaceivarsクラスの で、その下の 3 つの要素はpropertiesivar のアクセサー (ゲッターとセッター) です。

通常、オブジェクトのプロパティ(属性と関係という意味で) には、一対のアクセサー ( getter/setter ) メソッドを介してアクセスします。アクセサー メソッドを使用することで、カプセル化の原則に従います。API のクライアントが実装の変更から隔離されたまま、getter/setter ペアの動作と基礎となる状態管理を厳密に制御できます。

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

宣言されたプロパティは、次の機能を提供することでこれらの問題に対処します。

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

参考: https ://developer.apple.com/library/mac/#documentation/cocoa/conceptual/objectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW1

于 2012-04-18T04:22:07.707 に答える
2

カメレオン博士の回答を拡張すると、iVar は @synthesize 行で明示的に宣言できるため、この場合は不要です。たとえば@synthesize name = _name、.h で iVar を宣言するのと同じです (この構文にはプロパティが必要であることに注意してください)。どちらが優れているというわけではなく、どちらかがより効率的なコーディングです。

于 2012-04-18T04:25:06.433 に答える