【问题标题】:NSMutableDictionary cocoa memory leakNSMutableDictionary 可可内存泄漏
【发布时间】:2013-04-18 17:39:47
【问题描述】:

下面的代码有内存泄漏吗?我猜不,但对我来说,下面的代码分配内存但不释放它。

感谢任何帮助

@autoreleasepool {
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    for (int i = 0; i < 300000; i++) {
        @autoreleasepool {
            [dict setObject:[NSNumber numberWithInt:i] forKey:[NSNumber numberWithInt:i]];
        }
    }
    [dict removeAllObjects];
}

【问题讨论】:

  • 不应该。您是否正在运行一些指示存在内存泄漏的工具?
  • 不,我在 ActivityMonitor 中看到内存。泄漏命令不显示任何泄漏。由于 QA/Manager 只考虑活动监视器,它应该放在里面。
  • 哪些对象没有释放?
  • 他在活动监视器中查看的具体内容是什么?很可能,他对某些东西的解释有误。
  • 您发布的代码中的每个对象都是自动释放的对象。这包括NSMutableDictionary 和两个NSNumber 对象。

标签: objective-c


【解决方案1】:

我不知道这是否会影响您的问题,但值得了解...

NSNumber 在幕后做了一些花哨的事情,尤其是对于整数 0 - 12。它并不总是释放它们,因为它假设它很可能需要在未来重用它们。它们被认为足够常用,以至于不想一直保留/删除它们。

看到这个discussion。

这可能会导致少量内存未释放,但不会占很大比例。

将上面的代码放在一个 for 循环中会很有趣,看看是否多次调用它会增加内存,或者使用的内存量是否保持不变。

for (int i = 0; i < 100; i++) {
    @autoreleasepool {
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        for (int i = 0; i < 300000; i++) {
            @autoreleasepool {
                [dict setObject:[NSNumber numberWithInt:i] forKey:[NSNumber numberWithInt:i]];
            }
        }
        [dict removeAllObjects];
    }
}

如果它保持平稳,我就不会太担心了。

【讨论】:

  • 我尝试了建议的 for 循环,两者的内存使用量相同(有和没有 for 循环)大约 256 MB。 256 MB!,是不是太多了?我了解大约 1 到 12,但它应该为其他人发布
  • 你说你没有内存泄漏,但是有一段时间你需要一个巨大的字典来增加你的内存负载。这就是您的峰值内存负载,您可能希望重新编写代码以不需要 300K 对象字典。在那之后内存没有下降的事实可能只是操作系统保持分配给您的应用程序的内存,以防您再次需要它。
  • 这是 iOS 还是 OS X?如果是 iOS,则测量设备上的内存,而不是模拟器。
  • 这是 OS X,正如您所提到的,原因可能是“内存没有下降的事实可能只是操作系统保留分配给您的应用程序的内存以防万一您需要它再次。”
  • 它的价值:根据您的架构,您有时可以在第二个临时进程中执行操作。当分叉的进程消失时,它的所有内存也会消失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
相关资源
最近更新 更多