我正在开发一个应用程序,还剩下一个漏洞。泄漏的对象为NSAutoreleasePool,大小为32字节。在堆栈跟踪中,只调用基础方法。我不知道如何解决这个问题。
在模拟器中没有泄漏报告,在设备上只有这次泄漏。
你有什么想法吗?
自动释放池是我自己定义的池。
在我的视图控制器中,我调用:
[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调用的方法,使其在主线程上运行,并删除了那些自动释放工具。
我还是收到了NSAutoreleasePool上的漏洞。今天我了解到你可以在仪器的堆栈跟踪中显示“库名称”。:-)我将其复制到下面,您可以在第6行和第7行看到MapKit。
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的代码:
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:]感谢你到目前为止的所有评论。有什么建议吗?
发布于 2010-11-12 21:23:38
发布于 2010-11-12 00:50:32
我发现一个泄漏的NSAutoreleasePool经常指向错误的NSAutoreleasePool。你在数据提供者的getDetailInfo中使用NSAutoreleasePool吗?那打电话的人呢?
我以前读过,排出外部的NSAutoreleasePool应该排出内部的,但我还没有发现情况是这样的。
…此外,在NSAutoreleasePool上,drain比release更受欢迎。不过,这不是你的问题。
https://stackoverflow.com/questions/4156517
复制相似问题