Instruments 在此方法中报告 100% 泄漏:
+(void)initialize{
mapper = [[NSMutableDictionary alloc] init];
}
假设 Instruments 没有报告误报,有哪些可能的情况会导致这种情况?多线程(尽管文档说它是以“线程安全的方式”调用的)?
这是非 ARC。
Instruments 在此方法中报告 100% 泄漏:
+(void)initialize{
mapper = [[NSMutableDictionary alloc] init];
}
假设 Instruments 没有报告误报,有哪些可能的情况会导致这种情况?多线程(尽管文档说它是以“线程安全的方式”调用的)?
这是非 ARC。
问题(假设是非 ARC 环境)是您分配了内存mapper
但您从未释放它。
使用自动释放池:
+(void)initialize {
@autoreleasepool {
mapper = [[NSMutableDictionary alloc] init];
}
}
在这种情况下,对象的创建可能会导致自动释放对象(例如,在 NSMutableDictionary 的实现中是内部的或临时的)。当然,如果这是问题所在,您会在控制台中看到“……autoreleased with no pool - just leaking”消息。
您还应该考虑懒惰地初始化您的共享/全局内容,或者在您的应用程序启动后初始化。
如果您没有看到这些消息,那么这将不适用。
问题是上面有这个类的子类。在块中设置alloc
s修复了泄漏。initialize
dispatch_once
Mike Ash 的这篇文章有助于弄清楚initialize
。