0

スレッドセーフなメソッドを作成する最良の方法は何ですか?

私は次のメソッドを持っています。非同期で呼び出したい場合があります(スレッドを介して呼び出したい)。メインスレッドで直接呼び出したい場合もあります。別のスレッドでメソッドを呼び出していない場合でも、プール (割り当て、解放) を維持することに問題はありますか?

- (void)doStuff
{
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
     //do some stuff here?
     [pool release];
}
4

4 に答える 4

2

メインスレッドで呼び出すのは完全に安全です。NSAutoreleasePool はスタックを維持するため、この場合は新しいプールをスタックの上に置き、完了したらそれをポップします。

于 2010-10-28T21:24:57.203 に答える
1

いいえ、常に独自のメソッド ローカル プールを使用しても問題はありません。[pool drain]ただし、の代わりに使用する必要が[pool release]あります。

于 2010-10-28T21:24:47.940 に答える
0

私はまた、IvoJanschによって言及された方法を好みます。プールの作成/排出は有効ですが、メソッドdoStuff:を再帰的または何度も呼び出すと、少し頭痛の種になる可能性があります。しかし、Ivoの方法に従うことで、メモリの問題なしに何かを行うことができます。また、メソッドをスレッドセーフにするには、必要なときはいつでも、通常は配列/バッファー/ディクショナリにアクセスするときに、ロックまたは@synchronized()を使用する必要があります。あなたの方法はこのようなものでなければなりません

- (void)doStuff{
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

 @synchronized(lock) 
 {
    NSLog(@"Hello World");
 }
 [pool release];}
于 2010-10-29T07:21:57.250 に答える
0

それがリリース プールにとって何を意味するかに関係なく、このように記述することはお勧めしません。メインスレッドと他のスレッドからメソッドを呼び出せるようにする必要がある場合は、次のようにコーディングします。

- (void) doSomething {
}

- (void) doSomethingInBackground {
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    [self doSomething];
    [pool release]
}

このようにして、リリース プールを処理するメソッドでメソッドをラップします。

于 2010-10-28T21:30:29.493 に答える