泄漏NSAutoreleasePool

时间:2010-11-11 16:13:31

标签: iphone memory-leaks instruments

我正在开发一个应用程序并且还有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:]

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

2 个答案:

答案 0 :(得分:2)

已知问题:https://devforums.apple.com/message/282497#282497

感谢您的思考。

答案 1 :(得分:0)

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

我之前已经读过,排出一个外部的NSAutoreleasePool应该会耗尽内部的那些,但我还没有发现这种情况。

...此外,drain优先于release NSAutoreleasePool。不过,这不是你的问题。