について。
ガベージコレクトされないアプリケーションでは、aSelector で与えるメソッドが新たに切り離されたスレッドのために、自動解放プールを設定して、セレクタの実行が終了する前にプールを解放する責任があります。ガベージコレクトされるアプリケーションは自動解放プールを作成する必要はありません。
切り離されたスレッドを実行している間 aTarget と anArgument が与えるオブジェクトは保持され、そのあと解放されます。切り離されたスレッドは aTarget オブジェクトの aSelector で与えるメソッドが完了するとすぐに(クラスメソッドの + (void)exit を使用して)終了します。
このスレッドがアプリケーションで最初に切り離されたスレッドの場合、このメソッドはデフォルトの通知センタに nil オブジェクトをともなって NSWillBecomeMultiThreadedNotification を投函します。
つまり
ガベージコレクションをしないアプリケーションでは、指定したセレクタ内で、自動解放プールの管理をしなさいねとのこと。例えば
- (IBAction)saveData:(id)sender { [NSThread detachNewThreadSelector:@selector(saveBitmap) toTarget:bitmapController withObject:nil]; }みたいなのがあって、ターゲットのオブジェクトでは
- (void)saveBitmap { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; /* 処理 */ [pool drain]; }を実装します。 また、10.5 以降ではこのクラスメソッドだけでなく NSThread のインスタンスが生成できるようになりました。NSOperation と同様の制御が可能です。
0 件のコメント:
コメントを投稿