Ios +;初始化

Ios +;初始化,ios,memory-leaks,instruments,Ios,Memory Leaks,Instruments,仪器报告此方法存在100%泄漏: +(void)initialize{ mapper = [[NSMutableDictionary alloc] init]; } 假设仪器没有报告假阳性,有什么可能的情况会导致这种情况?多线程(尽管文档称它是以“线程安全方式”调用的) 这是非ARC。问题(假设为非ARC环境)是为映射器分配内存,但从未释放它。问题(假设为非ARC环境)是为映射器分配内存,但从未释放它。使用自动释放池: +(void)initialize { @autorele

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

+(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!