运行时错误:__ NSAutoreleaseNoPool():...自动释放没有池到位 - 只是泄漏

时间:2011-08-25 11:07:58

标签: ios multithreading memory-leaks xcode4

在编译iOS项目时,我收到了一个错误列表,如以下错误。

2011-08-25 12:32:44.016 rtsp[55457:6003]
    *** __NSAutoreleaseNoPool(): Object 0x64095a0 of class __NSArrayM
    autoreleased with no pool in place - just leaking 

由于以下功能而出现

- (void) start {   
    //Existing code
    session = [[RTSPClientSession alloc] initWithURL:
        [NSURL URLWithString:
         @"rtsp://video3.americafree.tv/AFTVComedyH2641000.sdp"]];
    [session setup];
    NSLog(@"getSDP: --> %@",[ session getSDP ]);
    NSArray *array =  [session getSubsessions];

    for (int i=0; i < [array count]; i++) {
        RTSPSubsession *subsession = [array objectAtIndex:i];       
        [session setupSubsession:subsession clientPortNum:0 ];
        subsession.delegate=self;
        [subsession increaseReceiveBufferTo:2000000];
        NSLog(@"%@", [subsession getProtocolName]);
        NSLog(@"%@", [subsession getCodecName]);
        NSLog(@"%@", [subsession getMediumName]);
        NSLog(@"%d", [subsession getSDP_VideoHeight]);
        NSLog(@"%d", [subsession getServerPortNum]);
    }
    [session play];
    NSLog(@"error: --> %@",[session getLastErrorString]);
    [session runEventLoop:rawsdp];
}

当我添加NSAutoreleasePool到我的功能

- (void) start {
    NSAutoReleasePool *pool=[[NSAutoReleasePool alloc] init];
    session = [[RTSPClientSession alloc] initWithURL:[NSURL ...
    ...
    [pool drain];
}

错误消失但我的功能没有得到任何输出。是否正在添加NSAutoreleasePool正确的解决方案?

1 个答案:

答案 0 :(得分:2)

您在控制台上收到消息,因为您正在后台线程上运行start方法,并且没有放置一个自动释放池,它将在释放对象后处理它们(释放计数== 0),这不会发生在主线程,因为主线程已经有一个池,对于后台线程你产生你负责设置自动释放池...你的解决方案是问题的正确解决方案..所以这是一个何时使用自动释放池

的示例

在后台生成要执行的东西的一种方法是调用NSObject的performSelectorInBackground方法,我假设你正在做

[myObject performSelectorInBackground:(@selector(myBackgroundMethod:) withObject:nil];

现在这个方法将在后台线程上执行,你需要放置一个自动释放池,以免它泄漏,如此

   -(void)myBackgroundMethod:(id)sender
{
     NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
     //do stuff
     [pool release];

}

希望清除它

丹尼尔