2010-11-11 29 views
0

我正在处理一个应用程序,并且有1个泄漏。 泄漏的对象是NSAutoreleasePool,大小是32字节。 在堆栈跟踪中,只调用基础方法。 我不知道如何解决这个问题。泄漏NSAutoreleasePool

在模拟器没有泄漏报告,在设备上只有这个泄漏。

任何想法的?

autoreleasepool是我自己定义的一个。

在我的ViewController我打电话:

[self performSelectorInBackground:@selector(getDetailInfo:) withObject:self.infoID]; 

这是getDetailInfo:

- (void)getDetailInfo:(NSString *)theID { 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    DetailInfo *info = [[DataProvider sharedInstance] getDetailInfo:theID]; //the return object is autoreleased. 
    [self performSelectorOnMainThread:@selector(updateViewWithDetailInfo:) withObject:info waitUntilDone:NO]; 

    [pool release]; 
} 

一些额外的信息:

为了测试我改变了我的所有方法其使用performSelectorInBackground运行叫在主线程上,并删除那些autoreleasepools。

我仍然收到NSAutoreleasePool泄漏。今天我了解到,您可以在乐器中的堆栈跟踪中显示“库名称”。 :-)我复制它的下方,你可以看到线6和7

0 libSystem.B.dylib calloc 
1 libobjc.A.dylib _internal_class_createInstanceFromZone 
2 libobjc.A.dylib class_createInstance 
3 CoreFoundation +[NSObject(NSObject) allocWithZone:] 
4 Foundation +[NSAutoreleasePool allocWithZone:] 
5 CoreFoundation +[NSObject(NSObject) alloc] 
6 MapKit TileCachePrivate::runCacheThread() 
7 MapKit _runCacheThread(void*) 
8 libSystem.B.dylib _pthread_start 
9 libSystem.B.dylib thread_assign_default 

本作的MapView代码的MapKit:

MKMapView *omgeving = [[MKMapView alloc] initWithFrame:CGRectMake(11, 22, 298, 297)]; 
    omgeving.delegate = nil; 
    [self addSubview:omgeving]; 
    [omgeving release];  

如果我注释掉的MapView码,无泄漏。如果我把它放进去,我会得到泄漏。

Leaked Object  # Address  Size Responsible Library Responsible Frame 
NSAutoreleasePool  0x6a52e50 32  Foundation   +[NSAutoreleasePool allocWithZone:] 

感谢您所有的评论到目前为止。 有什么建议吗?

+0

autorelease池在哪里?这是main.m中的吗?或者它是你自己定义的一个。如果是这种情况,则需要在完成时消除或释放自动释放池。 – DHamrick 2010-11-11 16:24:41

+0

DHamrick是对的。你能告诉我们你正在分配你正在泄漏的池的代码,以及你正在耗尽它的地方吗? – Ryan 2010-11-11 16:30:24

+0

我已编辑帖子以包含autoreleasepool的代码。 – McDJ 2010-11-11 16:41:31

回答

0

我发现泄漏的NSAutoreleasePool经常指向错误的NSAutoreleasePool。你在DataProvider的getDetailInfo中使用NSAutoreleasePool吗?来电者怎么样?

我已经阅读过,排水外NSAutoreleasePool应该是内流的,但我还没有发现这种情况。

...此外,drain优于releaseNSAutoreleasePool。但这不是你的问题。

+0

我不使用DataProvider中的NSAutoreleasePool。我在DataProvider中进行SOAP调用,解析JSON,创建一个自动释放对象并将其返回给viewController。然后更新主线程上的视图。 – McDJ 2010-11-11 16:58:05