+初始化中的内存泄漏

时间:2012-08-28 17:58:15

标签: ios memory-leaks instruments

仪器报告此方法100%泄漏:

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

假设乐器没有报告误报,可能会出现什么情况?多线程(虽然文档说它是以“线程安全的方式”调用的)?

这是非ARC。

3 个答案:

答案 0 :(得分:2)

问题(假设非ARC环境)是您为mapper分配内存,但您永远不会释放它。

答案 1 :(得分:1)

使用自动释放池:

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

在这种情况下,对象的创建可以导致自动释放的对象(例如,在NSMutableDictionary的实现中内部或临时)。当然,如果这是问题,你会在控制台中看到“...自动释放没有池 - 只是泄漏”消息。

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

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

答案 2 :(得分:1)

问题是上面有这个类的子类。在alloc块中的initialize中设置dispatch_once可修复泄漏。

来自Mike Ash的

This post帮助找出了initialize