【问题标题】:Memory is increasing all the time in navigation based iphone app在基于导航的 iPhone 应用程序中,内存一直在增加
【发布时间】:2010-08-23 21:19:02
【问题描述】:

我有一个基于导航的应用程序,带有 5 个 ViewController。在用仪器检查内存分配后,我发现内存在永久增加。该应用程序以 2 MB 启动,在浏览完所有 5 个 Navigationcontrollers 后,它会增长到 10 MB 并且还在增加...... 对于每个分配的对象,我的代码中都有一个相应的释放(在 dealloc 或其他地方),所以显然没有内存泄漏。 Instruments 还告诉我找不到内存泄漏。

如何解决这个内存问题?在某个时间点,在向前和向后浏览视图后,会出现内存不足警告并且背景图像消失(我没有取消分配图像,所以 iphone 会自行处理)。

如何确定“内存泄漏”问题的根源?只要应用程序还活着,图像是否有可能缓存在某个地方并保存在内存中?

我总是这样分配图像:

UIImage *kaufpreisImage = [[UIImage alloc] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"kaufpreis_background_green18px" ofType:@"png"]];

图像位于资源文件夹下。

非常感谢您的帮助!我找不到解决办法!

非常感谢您

问候菲尔

编辑:

剩下的唯一问题是当我尝试发送电子邮件时。我想发送一封电子邮件,其中包含电子邮件正文中的多个 html 表格和图像。图像是 base64 编码的。发送多封邮件后,我收到内存不足警告,尽管我在 sendMail() 方法中释放了所有内容(图像、数字等)。

有谁知道发送 base64 编码图像是否会导致问题?谁能给我一个提示,我如何在电子邮件正文中发送图像(例如,作为 html 表中的背景图像,如 style="background-url(data:image/png;base64,%@)")?为了澄清,这有效。图像被发送到客户端(在 MacOS 上测试)但有时会出现内存问题...

非常感谢

【问题讨论】:

  • 感谢大家的回复。单例方法比将所有图像保留在适当的 ViewController 中效果要好得多。

标签: iphone memory memory-leaks


【解决方案1】:

您需要在获得这些图像的所有权后发布这些图像。

【讨论】:

    【解决方案2】:

    也许您应该尝试分配工具中的“Heapshot”功能。只需在您的第一个控制器启动时进行“标记堆”,然后继续导航并返回。再拍一张。重复此过程 8-10 次。在 heapshots 列表中,您将看到在 heapshot 和下一个 heapshot 之间分配了一些内存(否则如果数量很小并且趋于零,这是正常的),请尝试检查它以检查您是否分配了剩余的东西活着。

    【讨论】:

    • 感谢您的建议。我会试一试。我将图像创建移到了一个单例类,该类按需实例化图像,但只有一次。这些改变似乎奏效了。内存分配急剧下降。虽然,我在对应的ViewController的dealloc方法中释放了图片,内存并没有自行减少,这似乎有点奇怪。
    【解决方案3】:

    如果您使用 [[UIImage alloc] init...] 创建 UIImage 的实例,您有责任释放它们。

    如果您从主包加载图像,请尝试使用 +(UIImage *)imageNamed:(NSString *)name。这个返回的 UIImage 是自动释放的,所以你不必释放,而且 UIKit 在使用 imageNamed 方法时会处理缓存。

    【讨论】:

    • 我确实在 dealloc 方法中释放了图像,但我认为这些图像仍保留在某个地方的缓存中。这可能吗?
    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多