【问题标题】:iOS Memory Management - Issue with growing ImageIO_PNG_Data and CoreAnimationiOS 内存管理 - ImageIO_PNG_Data 和 CoreAnimation 增长的问题
【发布时间】:2014-04-06 02:43:37
【问题描述】:

我遇到了一个应用程序问题,每次推送到特定视图时内存都会继续增长。重新创建这种内存增加的过程是:

  1. 显示用户登录视图控制器
  2. 推送主页视图控制器
  3. 推送设置视图控制器
  4. 注销用户(设置视图控制器中的一个按钮) - 弹出到用户登录视图控制器
  5. 登录并推送主页视图控制器

每次我推送到主视图控制器时(即使我已经确认前一个控制器正在被释放),内存都会增加 6+mb。我对应用进行了分析,发现分配中的 VM:ImageIO_PNG_Data 和 VM:CoreAnimation 类别存在一个明显问题。

其中一些发生在我正在使用的名为 Masking View 的类中,该类在该视图下方绘制图层的指定部分。用于绘制的代码如下:

//Draw project image
CGRect newRect = self.frame;
if (useCustomFrame){
    newRect = customFrame;
}

CGImageRef image = CGImageCreateWithImageInRect([self.projectedImage CGImage], newRect);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0, rect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, rect, image);

// Release Context
CGImageRelease(image);

【问题讨论】:

  • 尝试释放上下文。 CGContextRelease(上下文);
  • 释放上下文会导致错误,我认为是由于过度释放,因为这是 ARC:CGContextResetState: invalid context 0x9296780。这是一个严重的错误。此应用程序或它使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体下降。此通知是出于礼貌:请解决此问题。这将成为即将到来的更新中的致命错误。
  • 您想使用 Leaks 工具而不是 Allocations 来运行它。泄漏的最大事情也往往不是导致泄漏的事情。
  • 我曾用 Leaks 对其进行过分析,之前希望能找到一些东西,但现在返回 0 个泄露的对象。这可能是最让我失望的事情。
  • 问题可能不是泄漏,而只是废弃的内存。这意味着您仍然可以从某个地方对图像进行有效引用,但不再可以访问它。尝试在您的主视图控制器上进行一些世代分析(也称为堆分析) - developer.apple.com/library/ios/documentation/DeveloperTools/…

标签: ios objective-c xcode memory-management allocation


【解决方案1】:

越来越多的内存问题大部分时间来自以下两种方式:

1.检查您在代码中使用的图像分辨率,仅使用所需的图像分辨率。

假设您在 1X 中使用 40x40 图像大小,在 2x 中使用 80x80 等等。 然后只使用所需的分辨率而不是更多。

  1. 检查您使用的是更新的延迟加载库。

使用内存分配工具并检查虚拟机分配,如果您有任何关于问题的 IMAGEIO,那么您肯定在 NSMainBundle 中包含高分辨率图像。

将高分辨率图像调整为所需分辨率并使用 imageWithContentsOfFile 代替 imageName。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多