2011-08-25 17 views
0

我越来越喜欢下面的错误错误的列表,当我编译我的iOS项目。运行时错误:__NSAutoreleaseNoPool():...自动释放与地方没有游泳池 - 刚刚泄露

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正确的解决方案?

回答

2

由于您在后台线程上运行start方法,并且没有放置Autorelease池,因此一旦它们被释放后就会照顾回收对象(发布计数== 0) ,这并不发生在主线程,因为主线程已经到位池,用于后台线程ü产卵,你有责任来设置自动释放池...您的解决方案是解决问题的正确解决方案..所以这里是何时何地使用自动释放池,产卵东西在后台执行

一种方式的例子是通过调用NSObject的的performSelectorInBackground方法,我假设你正在做的

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

现在,这个方法是要在后台线程执行,你需要放置到位自动释放池,以便它不漏,像这样

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

} 

希望清除它

丹尼尔

+0

好,谢谢,但你能告诉我更多具体在哪里,我应该将自动释放池?我的意思是我们在哪里正常放置它们。对不起,如果答案很明显,但我是iOS开发新手。 – Anila

+0

检查编辑 – Daniel

相关问题