2010-12-06 64 views
2

我呼吁在单独的线程在viewDidLoad方法的方法在iPhone中使用多线程时如何处理泄漏?

[NSThread detachNewThreadSelector:@selector(callWebService) toTarget:self withObject:nil]; 

-(void)callWebService{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
[NSThread detachNewThreadSelector:@selector(loadImages) toTarget:self withObject:nil]; 
[pool release]; 
    } 
-(void)loadImages{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [self performSelectorOnMainThread:@selector(reloadTable) withObject:nil waitUntilDone:false]; 
[pool release]; 
} 
-(void)reloadTable 
    { 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

[myTableView reloadData]; 
[pool release]; 

} 

同时使用线程如何处理泄漏?我想使用线程。

错误

*** __NSAutoreleaseNoPool(): Object 0x604b830 of class NSCFString autoreleased with no pool in place - just leaking 

*** -[NSAutoreleasePool release]: This pool has already been drained, do not release it (double release). 

回答

0

自动释放池必须drain,不release。所以我认为如果你把它改成[pool drain]它应该可以正常工作。

+0

仍存在相同问题 – Warrior 2010-12-06 15:21:02

0

不知道你是否找到了你的答案,但由于我碰到了类似于你的问题,我做了一些寻找。看起来,当你耗尽一个游泳池时,这(有效)等同于释放它。在类的文件说:

既然你不能保持一个自动释放池(或自动释放它,看到 保留并自动释放),排水池,最终有 重新分配它的效果。

所以,你应该只消耗一次池。如果在该点之后需要另一个上下文,则应该使用与先前在代码中生成相同的方式生成新的池。

如果没有可用的池,那么最终可能会泄漏(如您所述)。但是,autorelease调用应该在该实例中记录警告消息。关于线程,文档,有这样一段话

的应用套件在 创建主线程自动释放池事件循环的每个周期的开始,和水渠它在 结束,从而释放任何自动释放生成的对象 处理事件。如果您使用应用套件,则您通常不需要创建您自己的池。但是,如果您的应用程序 在事件循环中创建了大量临时自动发布的对象,但是,创建“本地”自动释放池到 可能有助于最大限度地减少峰值内存占用量。

希望这会有所帮助。