2011-06-22 13 views
0

私はiOSを使い慣れていますので、遅くなります。私は「_A」という名前の私の.hビューコントローラでオブジェクトを宣言し、私はプロパティを宣言するとき、私は、.mファイルに合成する際に「」と"a"という名前のオブジェクトと "_a"という名前のオブジェクトの間にリンクがありますか?

@synthesize a=_a; 

私は「A」または「_a」を使用する必要があります。私はそのオブジェクトを変更する? ( "a"は私の場合はUINavigationControllerです)。別の質問で

は、私のコンパイラが自動的に「_ob」宣言に宣言されたオブジェクトからの接続「OB」を描くのですか?

もう少し説明が残念ですが、この環境は私が使用しているものではありません。

答えて

4

このプロパティを介して、他のクラスから自分のクラス変数を設定することができ、オブジェクトは次のように宣言:

@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の値を設定するとき(ドット表記またはaa、およびsetAを宣言するオブジェクトのメソッド内の値を読み込むとき_aを使用したほうが良いでしょう。 Exampleオブジェクトを使用するオブジェクトでは、アクセサメソッド(ドット表記の有無にかかわらず)を使用する必要があります。

コンパイラは、ob_ob宣言の間で自動的には接続しません。この例では、@synthesize a = _a;ステートメントはオプションの= _aと接続します。象牙はどんな名前でもよい。 @synthesize a = george;も有効です。 = _a部分がなければ、コンパイラはaという名前のivarと2つのアクセサメソッドを作成します。

さらに1つの注意:インターフェイスで_aの宣言を省略することができます。_a ivarのスコープをExampleオブジェクトの実装だけに制限します。オプションの= _a@synthesizeステートメントに追加すると、インターフェイスで宣言されたプロパティと同じタイプのivarが作成されます。

0

@synthesizeあなたのプロパティのセッターとゲッターメソッドを生成するためにtell to compilerを合成します。あなたはivarまたはself.aをプロパティとして使うことができますが、違いはありません。 はまた、あなたが

[myClassInstance setA:newA]; 
oldA = [myClassInstance a]; //oldA = myClassInstance.a 
+0

_ "ivaまたはself.aをプロパティとして使用できますが、違いはありません" _ - そうではありません。違いがあります。例えば、あなたのプロパティがretainとマークされている場合、 'self.a = object;'を実行すると古いものを正しくリリースし、新しいものを保持しますが、 '_a = object;'を実行すると古いオブジェクトがリークし、自分で処理しなければクラッシュを引き起こします。同様に、カスタムゲッター/セッターを記述した場合、プロパティーを使用する代わりにインスタンス変数( '_a')に直接アクセスすると呼び出されません。 –

+0

あなたは正しくプロパティをオーバーライドしています。ここでは、例えば 'return nil; // or 0'。この場合、このivarのivarとpropertyの違いになります。 – beryllium

+0

あなたの例については、プロパティがどのようにマークされている(割り当て、保持している)のかわからないので、不適切です。 '_a = object'もリークしません。これは単純にポインタを割り当てることです。 – beryllium

関連する問題