2010-02-09 77 views
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 ?,以便我可以在performSelectorOnMainThread?中释放该对象。在登录后我不再需要这个对象,所以一个ivar似乎不是正确的路。处理这个问题的最好方法是什么?谢谢。

-Oscar

回答

5

detachNewThreadSelector:toTarget:withObject:文档回答你的问题:

aTarget和anArgument的分离线程的执行过程中被保留的对象,然后释放。

所以是的,您可以在调用detachNewThreadSelector之后自动释放对象或显式释放它。而且您不必在辅助线程中保留该对象。

+0

谢谢,应该查看文档=)。 – 2010-02-09 23:26:27

1

来自文档。

detachNewThreadSelector:toTarget:withObject:

目的aTarget和anArgument是 的 分离线程的执行期间保持,然后释放。一旦目标 完成执行aSelector 方法,退出 分离线程(使用 退出类方法)。

所以你不需要努力尝试。在这里Autorelease没问题,你不需要在线程中保留它,因为线程本身保留了参数和目标,并在完成时释放它。