NSObject发布......仍然出现在ObjectAlloc中

时间:2009-06-01 02:35:36

标签: iphone objective-c memory-management

我一直在追踪为什么NSObject引用,同时明确发布,仍然出现在ObjectAlloc中。事实上,已经将NSObject减少到一个基本shell,[[myObject alloc] init]紧跟一个[myObject release],它看起来不像是在ObjectAlloc中发布的。这是一个导航/弹出多个视图控制器的NavigationController应用程序的一个大问题,因为最近弹出的视图控制器没有被释放,因为这些“未发布的”NSObject引用。 Hmmmmmm。

我可以把我的代码放在这里,并且有一堆'让你永远无处可去。自动释放池,等等等等。

所以,让我们看看来自Apple的示例'SeismicXML'示例应用程序......在ObjectAlloc / Leaks中启动它。在getEarthquakeData中非常基本:

XMLReader *streamingParser = [[XMLReader alloc] init];
[streamingParser parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError];
[streamingParser release];        

尽管发布了它,但我在XMLReader的ObjectAlloc中看到了一堆垃圾。我打赌如果我们在这个应用程序上放置一个'刷新'按钮再次调用'getEarthquakeData',我们会在5次刷新后崩溃。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我认为您对ObjectAlloc工具感到困惑,该工具将显示应用程序生命周期内的所有对象分配。它的主要用途是跟踪内存使用情况。

我认为你想要的仪器是一个名为Leaks的仪器,它通过没有任何参考来向你显示泄漏的内存。这是在重新分配之前没有发送release-dealloc的对象的指针。

答案 1 :(得分:1)

可能有一个自动释放池保留在对象上。如果您创建了许多自动释放的对象而没有将它们清除出池,那么在您使用自动释放池返回外部循环之前,您将会出现泄漏。

以下是自动释放池的工作原理:在主循环中,有一个自动释放池。一切都是自动释放的。在每次循环迭代结束时,池中的所有对象都会被释放。如果你在某个地方的另一个循环中分配对象,那么在你返回主循环之前它们实际上不会被释放。当然,除非你为循环创建自己的自动释放池。

另一个问题可能是您的对象永远不会被释放。如果你在+ alloc和-release之间得到一个例外,你就会得到泄漏。解决这个问题的方法是使用:

[[[XMLReader alloc] init] autorelease]

最后,你可以在这里使用垃圾收集。我不太了解GC系统,告诉你应该期待什么样的行为。