何时释放/保留传递给次要线程的对象?

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

我的问题是,使用自动释放池是否是处理该对象释放的正确方式?一旦它被传递到次要线程,我会对其进行保留,并在不再需要时释放它。
然而,自动释放池是否可能在次要线程有机会保留它之前就释放了该对象?我是否需要为此创建一个实例变量?这样我就可以在performSelectorOnMainThread中释放该对象。我在登录后不再需要该对象,因此实例变量似乎不是正确的选择。如何最好地处理这个问题?谢谢。
-Oscar
2个回答

5

detachNewThreadSelector:toTarget:withObject:的文档已经回答了您的问题:

aTarget和anArgument对象在执行分离线程期间被保留,然后释放。

因此,在调用detachNewThreadSelector之后,您可以自动释放对象或显式释放对象。在次要线程中,您不必保留该对象。


谢谢,我应该查看文档的。=) - Oscar Gomez

1

来自文档。

detachNewThreadSelector:toTarget:withObject:

aTarget和anArgument对象在分离线程执行期间被保留,然后释放。一旦aTarget完成执行aSelector方法,分离的线程将退出(使用exit类方法)。

所以你不需要这么努力尝试。在这里,Autorelease很好用,而且你不需要在线程中保留它,因为线程本身会保留参数和目标,并在完成后释放它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接