2011-07-01 11 views
3

私は少し混乱しています。オブジェクトが.hファイルで宣言されている場合、自動的に "public"と見なされますか?ただし、.hファイルに@propertyを使用して編集します。これは私が理解できないところです:プライベートオブジェクトにgetter/setterを使用します。なぜ、.hファイルで宣言されたオブジェクトを "public"と見なす場合に@propertyを使用するのですか?公開オブジェクトとプロパティの使用

第二の事、私はこの例を見つけました:私たちは、このコードでprimaryKeyため@synthesizeを使用する理由私は理解していない:http://staging.icodeblog.com/wp-content/uploads/2008/08/9-todom1.png 、なぜ私たちはdatabaseオブジェクトに対して@propertyを使用していませんか?

答えて

3

オブジェクト(ivar)が.hファイルで宣言されている場合、それは公開されていないことは正しくありません。 getter/setterメソッドが提供されている場合のみです。それ以外の場合はgetter/setterメソッドは提供されません。

実際、@property/@synthesizeディレクティブは、デフォルトのゲッター/セッターメソッドを宣言して定義するための機能です。したがって、あなた自身で書くのではなく、指示文を使用するだけです。

プロパティを宣言すると、ドット表記を使用してオブジェクトのプロパティを参照する可能性があります。また、retain/assign/copy指定子のおかげで、それらのプロパティでメモリを管理する方法が明確になっています。 (そして、もちろん、@synthesizeはそれを正しく行います)。

サンプルについては、実際には、ivarがプロパティに関連付けられているかどうかは、設計上の選択です。可能であれば、.hファイルで宣言されたivarsがデフォルトで公開されているという前提を再考するだけで、より明確になります。つまり、primaryKeyは公開されており、databaseではありません。

hereのチュートリアルもありますが、Apple docsも忘れないでください。

EDIT:コメント欄からご質問について

すべてのIVARの性質を持っている必要はなく、またそれは、そのクラスの実装の内部で使用するために、ゲッター/セッターを持っていること。

@interface SomeClass : NSObject { 
    AnotherClass* _anotherClassObj; 
    AThirdClass* _aThirdClassObj; 
} 
@property (nonatomic, retain) AnotherClass* anotherClassObj; 
@end 

ここでは、2つのivarsがあります。 1つだけに@property宣言があります。 .mファイルには、たとえば次のようなものがあります。

このコードで
@implementation SomeClass; 
@synthesize anotherClassObj = _anotherClassObj; 

- (void)initWithClasses:(AnotherClass*)obj1 and:(AThirdClass*)obj2 { 
    ..... 
    self.anotherClassObj = obj1; 
    _aThirdClassObj = obj2; 
    ... 
} 

.... 
@end 

:あなたは構文を使用できるように

  1. @synthesizeanotherClassObjのためにゲッター/セッターのための実装を提供します:self.anotherClassObj = obj1。その構文は、クラスの実装の内部と外部から等しく使用できます。

  2. _aThirdClassObj = obj2;の簡単なポインタコピーのセマンティクスを使用して、iverに直接割り当てることができるゲッター/セッター(自動生成またはカスタム)がない場合。とにかく、_aThirdClassObjはそのクラス外からはアクセスできません。あなたがそれを必要とする場合

  3. さらに、@property ... anotherClassObjにもかかわらず、あなたはまだ、ゲッター/セッターをバイパスし、_anotherClassObj = xxxのように、自分の.mファイルに直接_anotherClassObjを参照することができます。

getter/setterは、ivarを "public"にする方法だけではありません。また、保持カウントを管理する上で重要な役割を果たします(プロパティ宣言で保持/割り当て/コピーの中から選択した指定に応じて)。したがって、上記self.anotherClassObj = obj1;ではobj1_anotherClassObjに割り当てられ、それも保持されます(以前に_anotherClassObjがオブジェクトを指していた場合、そのオブジェクトはreleaseに送信されます)。生のivar割り当ては、その種の機能を提供しません。

私の意見では、プロパティの保持カウント管理機能は、プロパティを使用するかどうかを判断するための可視性よりもはるかに重要です。

+0

感謝のセルジオ、.hファイル内ので、すべてのIVAR .mファイルでそれを使用し、そのあとに "="記号を付ける場合は、プロパティを持つ必要があります(つまり、setterを使用することを意味します)。あるいは私たちがivarsが財産を奪い、物を合成しないコードを見つけることができますか? – Paul

+0

@ Paul#2。 [this](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17)をお読みください。 –

+0

@sergio:編集のための感謝sergio!これはAnotherClass * _anotherClassObjのような "オブジェクト"のためですが、整数やその他のプリミティブの "プロパティ"は決して見ませんか?そして、保持物を除いて、「財産」を使用していないオブジェクトを見るのは一般的ですか?もう一度ありがとう – Paul

2

ヘッダーのすべてが公開されているわけではありません。デフォルトでは、ivars({}内の項目)は@protectedです。 @propertyの目的はデータカプセル化です。 @synthesizeまたは@dynamicは、プロパティの実装方法を宣言するために使用され、クラッシュや警告を防ぐためには、もう一方が必要です。

資源:
Defining Classes               @protected、@package、@private、@public参照
Declared Properties     @property参照

関連する問題