2011-07-18 7 views
4

私は自分のコードをバグより少なくすることを常に考えています。プロパティの割り当てに続いてautorelease

self.prop1 = [[[SomeClass alloc] init] autorelease]; 

私の思考があれば、そのアプリケーションの前にある:私は他のプログラマのコードをクリーンアップし、私は右のマルチスレッド環境での通話が安全ではないというのが私の仮定にいる場合は疑問に思って、この何回も見てきました別のスレッドが介入してprop1を解放する関数で行われ、次のrunLoopでは、prop1が他のスレッドによってnilに設定されていないと、init'dのポインタが再び解放される可能性があります。

Timeline: 

*-----------------**-----------* 
|     |   | 
|     |   Thread 1 autoreleases prop1 when done with function 
|     | 
|     Thread 2 releases prop1 
| 
Thread 1 calls the above code and doesn't finish the function 

私はこれが誰かにとって意味をなされ、私の懸念を明確にしたり緩和したりすることができると願っています。

+0

「自動リリース」は、実際にオブジェクトを解放しません、それだけに参照カウントシステムに指示します後である時点でそのオブジェクトの参照カウントを減らします。 – JAB

答えて

0

あなたのプロパティの種類によって異なります。あなたが/コピーを保持としてPROP1を設定した場合、あなたはこのように書く必要があります。

@property (nonatomic, retain) id prop1; 

if(self.prop1 == nil) 
{ 
    SomeClass *obj = [[SomeClass alloc] init]; 
    self.prop1 = obj; 
    [obj release]; 
} 

をあなたがのdeallocで

@property (nonatomic, assign) id prop1; 
if(self.prop1 == nil) 
{ 
    SomeClass *obj = [[SomeClass alloc] init]; 
    self.prop1 = [obj retain]; 
    [obj release]; 
} 

、あなたが例えばPROP1をrelaseなければならない[割り当てとしてPROP1を設定した場合

- (void)dealloc 
{ 
    [prop1 release]; 
    [super dealloc]; 
} 

あなたはマルチスレッドで安全にプレイしたい場合は、次のいずれかを選択できます。

1. Make property atomic 
2. Use @synchronized over prop1 
3. Use Mutex Lock 
+0

プロパティが割り当てられている場合は、プロパティを保持したくないという意味です。 –

+0

書式設定を改善していただきありがとうございました... – Lightygalaxy

1

通常よりもスレッドの安全性を心配する必要はありません。複数のスレッドを同じプロパティに書き込むことは悪いことであり、避けてください(ロックなど)。

あなたは、すなわちプロパティを使用していない、代わりに

prop1 = [[SomeClass alloc] init]; 

を使用して自動解放を取り除くことができます。それが必要でなければ私は決してautoreleaseを使用しません。この場合はそうではありません。

関連する問題