在编译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
正确的解决方案?
答案 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];
}
希望清除它
丹尼尔