このプロパティを介して、他のクラスから自分のクラス変数を設定することができ、オブジェクトは次のように宣言:
@interface Example : NSObject {
NSObject *_a;
}
@property (retain) NSObject *a;
@end
そして、このように実装:
#import "Example.h"
@implementation Example
@synthesize a = _a;
@end
は、名前のIVARを作ります_a
と、Example
オブジェクトの2つのアクセサメソッド。 _a
IVARでオブジェクトを返すa
- (NSObject *)a;
- (void)setA:(NSObject *)theA;
方法:アクセサメソッドは、これらの署名を持っています。メソッドsetA
は、_a
に格納されているオブジェクトを解放し(nilでない場合)、パラメータを_a
に割り当て、パラメータにretain
というメッセージを送信します。
これらの方法は、ドット表記法を介してアクセスすることができる:直接_a
にアクセス
Example *e = [[Example alloc] init];
// These two are equivalent.
e.a = anotherNSObject;
[e setA:anotherNSObject];
// These two are equivalent.
anotherNSObject = e.a;
anotherNSObject = [e a];
は、潜在的に、メモリリークなどの問題を引き起こして、アクセサメソッドを回避するであろう。たとえば、_a
がオブジェクトへの参照のみを保持し、新しいオブジェクト参照が_a
に割り当てられている場合、古いオブジェクトはリークされたオブジェクトになります。
は直接あなたの二つの質問に答えるために:あなたはa
または_a
のいずれかを使用することができ
。ほとんどの場合、あなたは_a
の値を設定するとき(ドット表記またはa
)a
、およびsetA
を宣言するオブジェクトのメソッド内の値を読み込むとき_a
を使用したほうが良いでしょう。 Example
オブジェクトを使用するオブジェクトでは、アクセサメソッド(ドット表記の有無にかかわらず)を使用する必要があります。
コンパイラは、ob
と_ob
宣言の間で自動的には接続しません。この例では、@synthesize a = _a;
ステートメントはオプションの= _a
と接続します。象牙はどんな名前でもよい。 @synthesize a = george;
も有効です。 = _a
部分がなければ、コンパイラはa
という名前のivarと2つのアクセサメソッドを作成します。
さらに1つの注意:インターフェイスで_a
の宣言を省略することができます。_a
ivarのスコープをExampleオブジェクトの実装だけに制限します。オプションの= _a
を@synthesize
ステートメントに追加すると、インターフェイスで宣言されたプロパティと同じタイプのivarが作成されます。
_ "ivaまたはself.aをプロパティとして使用できますが、違いはありません" _ - そうではありません。違いがあります。例えば、あなたのプロパティがretainとマークされている場合、 'self.a = object;'を実行すると古いものを正しくリリースし、新しいものを保持しますが、 '_a = object;'を実行すると古いオブジェクトがリークし、自分で処理しなければクラッシュを引き起こします。同様に、カスタムゲッター/セッターを記述した場合、プロパティーを使用する代わりにインスタンス変数( '_a')に直接アクセスすると呼び出されません。 –
あなたは正しくプロパティをオーバーライドしています。ここでは、例えば 'return nil; // or 0'。この場合、このivarのivarとpropertyの違いになります。 – beryllium
あなたの例については、プロパティがどのようにマークされている(割り当て、保持している)のかわからないので、不適切です。 '_a = object'もリークしません。これは単純にポインタを割り当てることです。 – beryllium