オブジェクト(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
:あなたは構文を使用できるように
@synthesize
はanotherClassObj
のためにゲッター/セッターのための実装を提供します:self.anotherClassObj = obj1
。その構文は、クラスの実装の内部と外部から等しく使用できます。
_aThirdClassObj = obj2;
の簡単なポインタコピーのセマンティクスを使用して、iverに直接割り当てることができるゲッター/セッター(自動生成またはカスタム)がない場合。とにかく、_aThirdClassObj
はそのクラス外からはアクセスできません。あなたがそれを必要とする場合
さらに、@property ... anotherClassObj
にもかかわらず、あなたはまだ、ゲッター/セッターをバイパスし、_anotherClassObj = xxx
のように、自分の.mファイルに直接_anotherClassObj
を参照することができます。
getter/setterは、ivarを "public"にする方法だけではありません。また、保持カウントを管理する上で重要な役割を果たします(プロパティ宣言で保持/割り当て/コピーの中から選択した指定に応じて)。したがって、上記self.anotherClassObj = obj1;
ではobj1
が_anotherClassObj
に割り当てられ、それも保持されます(以前に_anotherClassObj
がオブジェクトを指していた場合、そのオブジェクトはrelease
に送信されます)。生のivar割り当ては、その種の機能を提供しません。
私の意見では、プロパティの保持カウント管理機能は、プロパティを使用するかどうかを判断するための可視性よりもはるかに重要です。
感謝のセルジオ、.hファイル内ので、すべてのIVAR .mファイルでそれを使用し、そのあとに "="記号を付ける場合は、プロパティを持つ必要があります(つまり、setterを使用することを意味します)。あるいは私たちがivarsが財産を奪い、物を合成しないコードを見つけることができますか? – Paul
@ Paul#2。 [this](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17)をお読みください。 –
@sergio:編集のための感謝sergio!これはAnotherClass * _anotherClassObjのような "オブジェクト"のためですが、整数やその他のプリミティブの "プロパティ"は決して見ませんか?そして、保持物を除いて、「財産」を使用していないオブジェクトを見るのは一般的ですか?もう一度ありがとう – Paul