2012-04-12 7 views
1

Objective-Cのプロパティに値を割り当てることに疑問があります。自己の使用(または使用しない)。 Objective-Cのプロパティで

// MyClass.h 
@interface MyClass : NSObject { 
    MyOtherClass *myVar; 
} 

@property (nonatomic, retain) MyOtherClass *myVar; 

- (id)initWithValue:(NSString *)val; 

そして、この実装:実行のある時点で

// MyClass.m 
@implementation MyClass 

@synthesize myVar; 

- (id)initWithValue:(NSString *)val { 
    self = [super init]; 

    if (self != nil) { 
     /** Do some stuff with val... **/ 
     myVar = [method:val]; // Some method that returns a MyOtherClass value 
    } 

    return self; 
} 

、値を私はこのインタフェースを持っている場合、私は、例えば、「misteriously逃した」値、の問題の多くを持っていましたmyVarが消えたり、変化したりするなど...解決策は変わります:

myVar = [方法:val]; //

自己ためMyOtherClass値

を返す何らかの方法 .myVar = [方法:ヴァル]。 // MyOtherClassの値を返すメソッド

だから、自分自身を使うか使わないかの違いは何ですか?私が意味する、それが私はそれが問題の原因となります場合ではないので、それを使用してきましたが、あなたは自己を使用している場合

は、プロパティを使用している、事前

+0

[self.var vs varを呼び出す間の違い](http://stackoverflow.com/questions/4627646/difference-between-calling-self-var-vs-var) –

答えて

1

これは、@synthesize@synthesize myVar = _myVar;またはその変形に変更する理由の良い例です。そうすることなく、インスタンス変数を直接設定することができます。つまり、myVar = nilが直接セッターをバイパスするように設定することが可能です。

myVar = _myVar戦略を使用すると、あなたがその変数のためのあなたのセッターやゲッターの宣言を変更した場合myVar =とあなたのセッターやゲッターにアクセスするself.myVarを呼び出すことが必要になります。

あなたが_myVarを使用する必要がある唯一の場所である。

+0

良いですが、私は最後の部分に同意しません。変数を直接使用する方が適切な場合があります。 getter/setterを呼び出すことが別のメソッド呼び出しであるか、またはオブジェクトをalloc/initしてリリースを保存しているので、パフォーマンスについて心配する必要がある状況 – Ahti

+1

Trueですが、パフォーマンスの問題に気づくだけですセッターやゲッターを(多く、多くの、何度も)非常にタイトなループを繰り返し呼び出す場合。 –

3

にありがとう、なぜ私にはわからないことは明らかだとそれは "保持"とマークされています。変数を使用すると、プロパティをバイパスしているので、「保持」しません。 myVar = [[someObject method:val] retain];と書いて、プロパティと同じ効果を得ることができます。

+1

これは正しいアーク? – Kyle

0

はどんな方法あなたはvalに電話していますか?

私はあなたが

myVar = [method:val]; // Some method that returns a MyOtherClass value 

を行う際に、結果が自動解放オブジェクトであることを想像するだろう。つまり、initメソッドが終了すると、myVarオブジェクトが解放され、破棄されます。 myVar変数は、オブジェクトが存在していたメモリ内の場所を指していますが、そのメモリは何かでいっぱいになる可能性があります。

あなたはこのように、ドット構文を使用してプロパティのセッターメソッドを使用し

self.myVar = [method:val]; 

コンパイラによって自動的にあなたのために合成されたsetterメソッドは、周りにそれを維持するためにメッセージを保持オブジェクトを送信します。

また、このようなあなたのコードのエラーを修正することができます:ドット構文に固執する

myVar = [[method:val] retain]; // Some method that returns a MyOtherClass value 

が、そのより良いです。

+0

最近では、ARCを仮定するのが最善です。この場合、これは問題ではありません。 –

+0

ARCではARCを使用していないため、プロパティに 'retain'キーワードを使用することはできません。彼らがARCを使用していた場合、同等のキーワードは「強い」 – jackslash

+0

投稿者がおそらくARCの恩恵を受けることに同意しますが、 – jackslash

関連する問題