何时释放/保留传递给辅助线程的对象?
Posted
技术标签:
【中文标题】何时释放/保留传递给辅助线程的对象?【英文标题】:When to release/retain an object that is passed to a secondary Thread? 【发布时间】:2011-01-15 01:11:36 【问题描述】:我正在使用以下代码将对象传递给辅助线程:
(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 似乎不是正确的方法。处理这个问题的最佳方法是什么?谢谢。
-奥斯卡
【问题讨论】:
【参考方案1】:detachNewThreadSelector:toTarget:withObject:
的文档回答了您的问题:
对象aTarget和anArgument在分离线程执行期间被保留,然后被释放。
所以是的,您可以在调用 detachNewThreadSelector 后自动释放对象或显式释放它。而且您不必将对象保留在辅助线程中。
【讨论】:
谢谢,应该查看文档 =)。【参考方案2】:来自文档。
detachNewThreadSelector:toTarget:withObject:
对象 aTarget 和 anArgument 是 在执行期间保留 分离线程,然后释放。这 分离的线程退出(使用 退出类方法)只要 aTarget 已完成执行 aSelector 方法。
所以你不需要这么努力。自动释放在这里很好,你不需要在线程中保留它,因为线程本身保留了参数和目标,完成后会释放它。
【讨论】:
以上是关于何时释放/保留传递给辅助线程的对象?的主要内容,如果未能解决你的问题,请参考以下文章
在一个线程中创建并在objective-C中传递给另一个线程的自动释放对象