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];
 }

我的问题是,自动释放是处理该对象释放的正确方法吗?一旦它被传递到辅助线程,我会保留它并在我不再需要它时释放它。

但是,自动释放是否有可能在辅助线程有机会保留它之前释放对象?我是否必须为此创建一个 ivar?,以便我可以在 performSelectorOnMainThread 中释放对象?登录后我不再需要该对象,因此 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 回答