NSAutoReleasePool似乎无法正常工作

时间:2011-06-08 09:59:52

标签: iphone objective-c xcode4

我正在编写一个iPhone应用程序,它会在启动后立即占用内存并且不断占用更多内存。原因似乎是我已经包含了一个紧密的内循环,因为我想要运行很长一段时间。不要担心,它不应该是用户交互式应用程序的一部分,它只是用于测试内部代码。

在任何情况下,通过搜索stackoverflow我发现我应该使用我自己的NSAutoReleasePool,因为主要的一个没有到达。另外,我发现我应该避免使用自动释放。我已经做了这两件事,虽然我还没能摆脱所有自动释放呼叫。但是,这些并不能解决问题。现在,我的分配数量(根据仪器分配工具)以三角波模式传播,可能是因为池耗尽,但分配数量和总字节数不断上升。内存使用量的增加也反映在活动监视器中。被分配的对象属于各种类型,包括Malloc,CFString,NSConcreteMutableData;基本上很多核心库类和我的许多代码对象。

这基本上就是我正在做的事情:

for (int i=0; i<1000; i++) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    ... do lots of stuff

    [pool drain];
}

为什么会发生这种情况?根据泄漏工具我没有任何内存泄漏,我没有NSZombieEnabled设置或任何其他论据。

由于

更新: 我刚刚注意到当我使用不使用池时不存在的自动释放池时,会发现一些内存泄漏。奇怪......也许这有助于指出问题所在。我现在试图跟踪这些泄漏,但到目前为止,它们看起来并不像我的代码中的泄漏,但如果池实际上没有释放它们,它们就有意义了。

更新: 好吧,想通了,这是由一些事情引起的。首先,我没有正确地释放包含彼此引用的对象,因此这些对象永远不会被释放。其次,仍有内存泄漏,但这些都在基础类中。我在某个地方找到了一个答案,表明这并不奇怪,尤其是在模拟器中运行时,我不会太担心它。希望这对某人有用。

1 个答案:

答案 0 :(得分:1)

这可能是由某些系统缓存引起的,即ImageNamed和某些URL调用实际上将被系统缓存,因此不会泄漏,也不能手动释放任何内容。通常有更好的方法来处理这些事情,例如创建自己的图像缓存,你可以清除......

相关问题