1

Instruments 在此方法中报告 100% 泄漏:

+(void)initialize{
    mapper = [[NSMutableDictionary alloc] init];
}

假设 Instruments 没有报告误报,有哪些可能的情况会导致这种情况?多线程(尽管文档说它是以“线程安全的方式”调用的)?

这是非 ARC。

4

3 回答 3

2

问题(假设是非 ARC 环境)是您分配了内存mapper但您从未释放它。

于 2012-08-28T18:00:42.877 回答
1

使用自动释放池:

+(void)initialize {
    @autoreleasepool {
      mapper = [[NSMutableDictionary alloc] init];
    }
}

在这种情况下,对象的创建可能会导致自动释放对象(例如,在 NSMutableDictionary 的实现中是内部的或临时的)。当然,如果这是问题所在,您会在控制台中看到“……autoreleased with no pool - just leaking”消息。

您还应该考虑懒惰地初始化您的共享/全局内容,或者在您的应用程序启动后初始化。

如果您没有看到这些消息,那么这将不适用。

于 2012-08-28T18:03:31.843 回答
1

问题是上面有这个类的子类。在块中设置allocs修复了泄漏。initializedispatch_once

Mike Ash 的这篇文章有助于弄清楚initialize

于 2012-08-29T22:42:25.130 回答