2011-07-27 16 views
0

可能性の重複:
Difference between calling self.var vs var財産上の自己:同じコードのあるまたは自己無し

編集:実際に、私がする配列にオブジェクトを追加することを理解していませんでした「セッター」を必要とせず、実際には「ゲッター」を必要とするため、「自己」の使用は重要ではありませんでした。

なぜこのコードで私たちは時々「自己」を使うのか教えてください。時には、私たちはしていない:私たちは財産に送信する「メッセージ」を持っている場合、我々は通常「自己」を使用しますが、ここではexempleためlocationManagerデリゲートでは、我々はそれを使用しないでください:

- (void)viewDidLoad { 
    self.locationMeasurements = [NSMutableArray array]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    [locationMeasurements addObject:newLocation]; 

- (void)viewDidUnload { 
    locationDetailViewController = nil; 
} 


- (void)reset { 
    [self.locationMeasurements removeAllObjects]; 
} 
あなたが自己を使用する際にあなたの助けのための

おかげで

ポール

+1

この** viewDidUnload **メソッドはおそらくメモリリークの原因になります。 –

+0

これは役に立つかもしれません:http://stackoverflow.com/questions/2385980/objective-c-when-to-use-self – Luke

+0

リンクをありがとう、私はまた、なぜ私たちが最初の "自己"を使用するのだろうかと思っています。そして同じプロパティのために、私たちはアクセッサを使わずにivarを "直接"セットすることを選択しました... – Paul

答えて

1

あなたは、それによって特性を利用して割り当てるとき以外、またはコピーを読んだとき、保持原子(または原子)、割り当てなどの属性、アクセサメソッドを通過します。

自己を使用しない場合は、変数に直接アクセスします。

例:

@interface X : NSObject 
{ 
    NSObject * anObject; 
} 
@property(nonatomic,retain) NSObject * anObject; 

self.anObject = [[NSObject alloc]init]autorelease]; 

は、プロパティにオブジェクトを保持します

anobject = [[NSObject alloc]init]autorelease]; 

は、オブジェクトが後にリリースされます、それを保持しません。

自己。

-(NSObject *)anObject; 

and 

-(void)setAnObject:(NSObject *)other; 

あなたの財産宣言の属性がのviewDidLoadに、あなたのコード例では、これらの方法は、舞台裏で実装されているか、自己を

を定義します。ためにシンタックスシュガーです。割り当て後に配列が保持されることを確認するためにおそらく必要です。しかし、 "リセット"では、オブジェクトへの割り当てではなく、オブジェクト自体を操作するだけでは必要ありません(マルチスレッドやアトミックアクセサを扱わない限り)。注意すべき

ことの一つは、あなたがのviewDidLoad(MutableArray)で何かを作成する場合は、viewDidUnloadでそれを破壊する必要があることである(self.locationMeasurements = nilを;)

+0

ありがとうジョリス、私はexelpleで本当に理解していない、それは同じ "ivar"または自己と一度 "設定"されている "プロパティ"です。その後、この「自己」なしで。私のコードでは、同じ「locationMeasurement」が両方の方法を使用しています。なぜ私に説明できますか? – Paul

+0

私は私の答えに何かを加えました。うまくいけば、これは役に立ちます。 –

+0

ありがとうございますが、私は理解できないことがまだあります:ivarを変更するには、 "セッター"の権利が必要ですか?ここでは、addObjectで新しい項目を追加して配列を変更していますので、ivarは編集されますが、 "self"は使用されません。 setterを使ってivarを編集するには、新しいアイテムを直接 "addObject"して "self"を使わないでください。これは私が理解できないところです – Paul

0

self.を使用して、あなたが@propertyの利点のすべてを取得します宣言。これには、メモリ管理(コピー、リタイア、割り当ておよび解放)とアトミック性が含まれます。自己を使用しておらず、同じ名前のインスタンス変数がある場合、利益を失います。これは、変数を割り当てるときに特に効果があります。たとえば、viewDidUnloadは、locationDetailViewControllercopyまたはretainと宣言された場合にリークを引き起こします。これは、自己を使用しなかったためです。

+0

ジョー、前の答えの私のコメントについては、私はあなたにそれを求めている:私は本当に理解していない自己の使用か否か。私の例では、それは同じ "ivar"または "財産"であり、自己と一度 "セット"されているからです。その後は「自己」なしに私はそれがどちらか一方の方法だと思うでしょうが、私のコードでは、同じ "locationMeasurement"が両方の方法を使用しています。私にこれを説明できますか?再度、感謝します – Paul