2012-08-28 44 views
1

仪器报告了这种方法100%的泄漏:在+内存泄漏初始化

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

假设仪器不报告误报,可能导致这个什么可能发生的情况?多线程(尽管文档说它是以“线程安全的方式”调用的)?

这是非ARC。

+0

仪器*有*有时会报告误报。 (但是,这个实际上是一个泄漏)。 – 2012-08-28 18:00:05

回答

1

问题在于上面有这个类的子类。在initialize中设置allocdispatch_once块修复了泄漏。

This post来自Mike Ash帮忙计算出initialize

+0

我试过了上面的答案,但是我们的泄漏并没有消失,直到我们这样做。我们使用的类有子类,所以这种解决方案可能不适用于所有情况。接受你自己的答案,@raheel! – goldierox

2

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

+0

是的,但是你会在哪里释放它? 'dealloc'显然已经出来了。也就是说,释放它是没有意义的。 – raheel

1

使用自动释放池:

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

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

你还应该考虑懒惰地初始化你的共享/全局的东西,或者在你的应用程序完成启动后。

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

+0

这个想法是,这个对象将被跨线程使用,并且在'initialize'中创建它允许我们确保只有一个实例,并且以线程安全的方式创建。 – raheel

+0

@Justin不会在未定义的时间释放这个对象,破坏代码? – 2012-08-28 18:35:42

+0

@raheel确保初始化只发生一次,不需要您在加载图像(应用程序)时(即在主要甚至进入之前)初始化。参见'pthread_once()'的例子。 – justin