5

次のコードを使用して、オブジェクトをセカンダリ スレッドに渡しています。

 (void)login:(id)sender
{
  platformMsgs_LoginRequest *loginRequest = [[[platformMsgs_LoginRequest alloc] init] autorelease];
//more code...
 [NSThread detachNewThreadSelector:@selector(sendLoginRequest:) toTarget:self withObject:loginRequest];
//more code...
}

- (void)sendLoginRequest:(platformMsgs_LoginRequest *)loginRequest
 {
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 [loginRequest retain];
 NetSuiteBinding *binding = [NetSuiteServiceSvc NetSuiteBinding];
 NetSuiteBindingResponse *response = [binding loginUsingParameters:loginRequest      applicationInfo:nil partnerInfo:nil];
 [self performSelectorOnMainThread:@selector(loginOperationCompleted:)   withObject:response waitUntilDone:NO];
 [loginRequest release];
 [pool drain];
 }

私の質問は、autorelease はこのオブジェクトのリリースを処理する正しい方法ですか?. セカンダリ スレッドに渡されたら保持し、不要になったら解放します。

ただし、セカンダリ スレッドがオブジェクトを保持する前に、自動解放によってオブジェクトが解放される可能性はありますか? このために ivar を作成する必要がありますか? ログイン後にオブジェクトが不要になったため、ivar は適切な方法ではないようです。これを処理する最良の方法は何ですか? ありがとうございました。

-オスカー

4

2 に答える 2

5

のドキュメントdetachNewThreadSelector:toTarget:withObject:があなたの質問に答えます:

オブジェクト aTarget および anArgument は、切り離されたスレッドの実行中に保持され、その後解放されます。

はい、オブジェクトを自動解放するか、detachNewThreadSelector を呼び出した後に明示的に解放することができます。また、セカンダリ スレッドでオブジェクトを保持する必要はありません。

于 2010-02-09T23:23:30.870 に答える
1

ドキュメントから。

detachNewThreadSelector:toTarget:withObject:

オブジェクト aTarget および anArgument は、切り離されたスレッドの実行中に保持され、その後解放されます。切り離されたスレッドは、aTarget が aSelector メソッドの実行を完了するとすぐに (exit クラス メソッドを使用して) 終了します。

したがって、これを一生懸命試す必要はありません。ここでは自動解放で問題ありません。スレッド自体が引数とターゲットを保持し、完了したら解放するため、スレッド内で保持する必要はありません。

于 2010-02-09T23:29:20.840 に答える