2011-12-19 7 views
1

私はObjective Cを初めて使っています。多くのiPhone/iPadアプリケーションでは、オブジェクトをリリースした後にnilに設定されることがあります。オブジェクトを解放し、それをアトミックにする必要がありますか?

[self.obj release] 
self.obj = nil; 

これは、割り当てが解除されたメモリ位置を参照するポインタを残さないようにすると仮定します。ここで、次の状況を想定してください。

//Thread #1 code 
..some code 
..some code 
[self.obj release] 
        -------> Thread #2 runs //Thread #2 code 
              ..some code 
              if (self.obj){ 
              some code 
              } 
self.obj = nil; <----- Thread #1 runs 

この状況が可能かどうかは疑問でしたか?それがあれば、リリース/ nilをアトミックにする方法はありますか?

答えて

5

これは、あなたは、単に以前のインスタンスを解放しますセッターを呼び出します

self.obj = nil; 

を記述する必要があり、実際に

[self.obj release] 
self.obj = nil; 

完全に正しくありません。

+0

ありがとう男。意味する –

+0

obatプロパティにnonatomic属性が設定されていない場合、これは正しいです。 http://developer.apple。com/library/mac /#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html – Joel

+0

はい、私は気付いています。私はそのプロパティを非原子性にしました。ありがとうtho :) –

1

あなたが保証するために、@Synchronizedブロック内の両方の操作を囲むことができ、そのブロック離れる前に完全に両方の操作:その変数にアクセスする可能性のある他のスレッドでも同じロック・オブジェクトの周りに同期させること

@synchronized(lockObject) 
{ 
    [self.obj release]; 
    self.obj = nil; 
} 

を提供し、どんな問題にも対処するべきではありません。

+1

良い点。ありがとう、しかし、私は彼が以下に述べるように原子としてプロパティを設定して行った。 –

+0

アクセサー呼び出しの結果に 'release'を送信することはベスト・アイデアではありません。参照してください:http://stackoverflow.com/questions/7262268/why-shouldnt-i-use-the-getter-to-release-a-property-in-objective-c –

4

はい、爆発する可能性があります。あなたのコード例を考えてみましょう。あなたはアクセサ/ミューテータメソッドを参照する代わりに、直接あなたのオブジェクトにアクセスしていることを意味あなたがself.objを使用

[self.obj release]; 
self.obj = nil; 

。あなたは "obj"を保持されたプロパティとして宣言している可能性があります。後であなたのあなたが安全である@synthesizeによって作成された方法を使用してオブジェクトを解放した場合、あなたの.hは何かのような...

@property (retain) Something *obj; 

とあなたの.m

@synthesize obj; 

だろう。

[self setObj:nil]; 
// or equally valid 
self.obj = nil; 
// Below is (almost) identical way to access, release and nil the variable directly. 
// The major difference is you don't multi-threaded protection of your property 
// declaration (explained below). 
[obj release]; 
obj = nil; 

あなたが戻って、私は上記の指定されたプロパティを見ればあなたは、私は非常に一般的にnonatomic見に入れていなかったに気づくでしょう。偶然ではありませんでした。合成されたアクセサは、マルチスレッド環境でのプロパティへの堅牢なアクセスを提供するようにAppleのdocs

のプロパティを見てみましょうデフォルトでアトミックで、セッターを経由してゲッターから返されたか、設定された値が常に完全に取り出されますか他のスレッドが同時に実行しているものとは無関係に設定します。

+0

ありがとう、私はあなたとアンダーズの答えの上記の組み合わせを選択しました。 ** self.obj = nil; **を使用して、古い値を解放するためにsetterを呼び出します。また、あなたが言ったように、私は@propertyをアトミックに設定します。私は彼の答えを選びました。正しい答えは1つだけ選択できます> –

関連する問題