除了泄漏之外的东西会导致内存在Objective-C中无限增长吗?

时间:2012-11-02 20:20:35

标签: objective-c memory-management instruments

我有一个游戏循环,我把它放在另一个循环中:

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

    Game *game = [[Game alloc] init];
    while ([game isActive])
       [game nextRound];
    [game release];

    [pool release]; 
 }

但我注意到在活动监视器中,使用的实际内存无限增长,当应用程序达到大约1GB的内存时,应用程序最终会崩溃。仪器没有报告任何泄漏。 clang静态分析仪也没有报告泄漏。

我的问题是:

  1. 乐器是否总能找到所有内存泄漏?
  2. 这种无限期增加内存会有另一个原因吗?
  3. 修改

    正如@Phillips指出的那样,原因是僵尸旗帜!关闭后,内存占用量与预期一致。

2 个答案:

答案 0 :(得分:2)

你有一个很大的while循环,里面没有自动释放池。尝试

while ([game isActive]) {
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   [game nextRound];
   [pool release];
}

答案 1 :(得分:2)

仪器也可用于查看内存分配。尝试在内存增长时查看活动对象的数量,以查看哪些内容仍处于活动状态。

这不一定是泄漏导致记忆增长。例如,如果您在nextRound期间创建了一些保留Game对象的对象,则在您发布的代码中发布该对象可能不会产生dealloc