【问题标题】:How to handle leaks when using a multiple threads in iphone?在iphone中使用多线程时如何处理泄漏?
【发布时间】:2011-05-21 01:04:06
【问题描述】:

我在 viewdidload 方法的单独线程中调用了一个方法

[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).

【问题讨论】:

    标签: iphone memory-leaks nsthread


    【解决方案1】:

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

    【讨论】:

    • 仍然存在同样的问题
    【解决方案2】:

    不知道您是否找到了答案,但由于我遇到了与您的问题类似的问题,因此我进行了一些查找。似乎当你排空一个池时,这(有效地)相当于释放它。该类的文档说:

    由于您无法保留自动释放池(或自动释放它——请参阅 保留和自动释放),排空池最终具有以下效果 释放它。

    因此,您应该只排空一个池子一次。如果在那之后您需要另一个上下文,您应该以与之前在代码中生成一个相同的方式生成一个新池。

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

    Application Kit 在主线程上创建一个自动释放池 事件循环的每个周期的开始,并在 结束,从而释放同时生成的任何自动释放对象 处理一个事件。如果您使用应用程序工具包,您因此 通常不必创建自己的池。如果您的应用程序 在事件循环中创建大量临时自动释放对象, 但是,创建“本地”自动释放池以 有助于最大限度地减少峰值内存占用。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-12-18
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2018-07-10
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      相关资源
      最近更新 更多