我正在开发一个应用程序并且还有1个漏洞。 泄漏的对象是NSAutoreleasePool,大小是32个字节。 在stacktrace中,只调用基础方法。 我不知道如何解决这个问题。
在模拟器中没有泄漏报告,在设备上只有这种泄漏。
有什么想法吗?
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调用的方法在主线程上运行并删除了那些自动释放池。
我仍然收到了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:]
感谢所有评论到目前为止。 有什么建议吗?
答案 0 :(得分:2)
已知问题:https://devforums.apple.com/message/282497#282497
感谢您的思考。
答案 1 :(得分:0)
我发现泄漏的NSAutoreleasePool
经常指向错误的NSAutoreleasePool
。你在DataProvider的getDetailInfo中使用NSAutoreleasePool
吗?打电话怎么样?
我之前已经读过,排出一个外部的NSAutoreleasePool
应该会耗尽内部的那些,但我还没有发现这种情况。
...此外,drain
优先于release
NSAutoreleasePool
。不过,这不是你的问题。