Cocoa 可可垃圾收集不起作用?

Cocoa 可可垃圾收集不起作用?,cocoa,garbage-collection,Cocoa,Garbage Collection,我已在Cocoa应用程序中启用垃圾收集。 为什么我的应用程序仍然使用大量内存。事实上,它不仅占用大量内存,如果我让它运行几个小时,它将占用几GB的内存,这是无法控制的。 我需要做什么特别的事情来完成这项工作吗?没有,但有几种方法可以实现这一点: 您可能在分配工具或目标环境中启用了僵尸。检查两者并确保僵尸已关闭 您可能正在放弃内存(保留对象,即使是在某个时间点之后从未使用过的对象,也永远不会放弃它们)。如果您将对象添加到某种缓存中,并且从未从中实际清除任何对象,那么这将特别容易。(imageN

我已在Cocoa应用程序中启用垃圾收集。

为什么我的应用程序仍然使用大量内存。事实上,它不仅占用大量内存,如果我让它运行几个小时,它将占用几GB的内存,这是无法控制的。


我需要做什么特别的事情来完成这项工作吗?

没有,但有几种方法可以实现这一点:

  • 您可能在分配工具或目标环境中启用了僵尸。检查两者并确保僵尸已关闭
  • 您可能正在放弃内存(保留对象,即使是在某个时间点之后从未使用过的对象,也永远不会放弃它们)。如果您将对象添加到某种缓存中,并且从未从中实际清除任何对象,那么这将特别容易。(
    imageNamed:
    就是这样做的,所以如果你以这种方式加载了很多图像,请小心。)使用堆照片查看堆积的对象,然后查看它们的历史记录以查看它们是在哪里创建的。还可以使用对象图工具查看是什么让它们存活下来

  • 此外,您直接泄漏了对象(可能是CF对象,默认情况下不可收集)。选择泄漏工具以查看它要说什么。

    在屏幕截图中-您已经为“调试”配置启用了垃圾收集。你确定你没有评测使用“release”配置编译的应用程序吗?垃圾收集并不意味着你不能有内存泄漏。仪器应该能显示哪些物体还活着。我正在使用“IKImageView”每隔几秒钟显示一个新图像。将图像加载到带有“[[NSImage alloc]initWithContentsOfFile:LocalTempImageStorage]”的NSImage中,并使用一些CoreGrahics函数将其转换为“CGImageRef”。从你所说的来看,这似乎是一个可能的罪魁祸首。我的替代方案是什么?用核心图形功能转换,你说?NSImage实际上有一种创建CGImage的方法;你可以考虑使用它。不过,这仍然只是对问题原因的疯狂猜测;仪器会准确地告诉你泄漏的是什么以及是在哪里产生的。