我正在处理一个应用程序,并且有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:]
感谢您所有的评论到目前为止。 有什么建议吗?
autorelease池在哪里?这是main.m中的吗?或者它是你自己定义的一个。如果是这种情况,则需要在完成时消除或释放自动释放池。 – DHamrick 2010-11-11 16:24:41
DHamrick是对的。你能告诉我们你正在分配你正在泄漏的池的代码,以及你正在耗尽它的地方吗? – Ryan 2010-11-11 16:30:24
我已编辑帖子以包含autoreleasepool的代码。 – McDJ 2010-11-11 16:41:31