Ios +;初始化
仪器报告此方法存在100%泄漏:Ios +;初始化,ios,memory-leaks,instruments,Ios,Memory Leaks,Instruments,仪器报告此方法存在100%泄漏: +(void)initialize{ mapper = [[NSMutableDictionary alloc] init]; } 假设仪器没有报告假阳性,有什么可能的情况会导致这种情况?多线程(尽管文档称它是以“线程安全方式”调用的) 这是非ARC。问题(假设为非ARC环境)是为映射器分配内存,但从未释放它。问题(假设为非ARC环境)是为映射器分配内存,但从未释放它。使用自动释放池: +(void)initialize { @autorele
+(void)initialize{
mapper = [[NSMutableDictionary alloc] init];
}
假设仪器没有报告假阳性,有什么可能的情况会导致这种情况?多线程(尽管文档称它是以“线程安全方式”调用的)
这是非ARC。问题(假设为非ARC环境)是为
映射器分配内存,但从未释放它。问题(假设为非ARC环境)是为映射器分配内存,但从未释放它。使用自动释放池:
+(void)initialize {
@autoreleasepool {
mapper = [[NSMutableDictionary alloc] init];
}
}
在这种情况下,创建对象可能会导致自动删除对象(例如,NSMutableDictionary实现中的内部或临时对象)。当然,如果这是问题所在,您会在控制台中看到“…自动释放,没有池,只是泄漏”消息
<>你也应该考虑懒惰地初始化你的共享/全局的东西,或者在你的应用程序完成启动之后。
如果您没有看到这些消息,则这将不适用。使用自动释放池:
+(void)initialize {
@autoreleasepool {
mapper = [[NSMutableDictionary alloc] init];
}
}
在这种情况下,创建对象可能会导致自动删除对象(例如,NSMutableDictionary实现中的内部或临时对象)。当然,如果这是问题所在,您会在控制台中看到“…自动释放,没有池,只是泄漏”消息
<>你也应该考虑懒惰地初始化你的共享/全局的东西,或者在你的应用程序完成启动之后。
如果您没有看到这些消息,那么这将不适用。问题是上面有这个类的子类。在initialize
中设置alloc
s,在dispatch\u中设置一次block,修复泄漏
Mike Ash帮助我们弄清楚了初始化问题在于上面有这个类的子类。在initialize
中设置alloc
s,在dispatch\u中设置一次block,修复泄漏
Mike Ash帮助我们找出了初始化
,仪器有时会报告误报。(然而,这实际上是一次泄漏)。仪器有时会报告误报。(然而,这一次实际上是一次泄漏)。没错,但你会在哪里释放它呢<代码>解除锁定
显然已退出。也就是说,取消分配它是没有意义的。是的,但是你会在哪里取消分配它呢<代码>解除锁定
显然已退出。也就是说,取消分配它是没有意义的。其思想是这个对象将跨线程使用,在initialize
中创建它允许我们确保只有一个实例,并且是以线程安全的方式创建的。@Justin不会在未定义的时间释放这个对象,破坏代码?@raheel确保初始化只发生一次,不需要在加载图像(应用程序)时(即在main进入之前)进行初始化。请参阅pthread\u once()
@Justin的示例。我没有看到自动释放池消息。@H2CO3它不会破坏代码。与以前一样,mapper
永远不会发布,或者在调用指定的全局销毁例程时显式发布。因此,它不会带来变化。虽然内存当然会在进程退出后返回到操作系统。其思想是该对象将跨线程使用,在initialize
中创建它可以确保只有一个实例,并且是以线程安全的方式创建的。@Justin不会在未定义的时间释放该对象,破坏代码?@raheel确保初始化只发生一次,不需要在加载图像(应用程序)时(即在main进入之前)进行初始化。请参阅pthread\u once()
@Justin的示例。我没有看到自动释放池消息。@H2CO3它不会破坏代码。与以前一样,mapper
永远不会发布,或者在调用指定的全局销毁例程时显式发布。因此,它不会带来变化。虽然内存当然会在进程退出后返回操作系统。我尝试了上述答案,但直到我们这样做,我们的漏洞才消失。不过,我们使用的类有子类,因此此解决方案可能不适用于所有情况。接受你自己的答案,@raheel!我尝试了上述答案,但直到我们这样做,我们的漏洞才消失。不过,我们使用的类有子类,因此此解决方案可能不适用于所有情况。接受你自己的答案,@raheel!