iOS内存管理 - ImageIO_PNG_Data和CoreAnimation不断增长的问题

4
我有一个应用程序的问题,每次推到特定视图时内存都会持续增长。重现这种内存增加的过程如下:
1. 显示用户登录视图控制器 2. 推送主页视图控制器 3. 推送设置视图控制器 4. 登出用户(在设置视图控制器中的按钮)- 弹出到用户登录视图控制器 5. 登录并推送主页视图控制器
每次我推到主页视图控制器时(即使我已确认前一个视图控制器正在被释放),内存都会跳升6+ mb。我对应用程序进行了分析,并在分配中看到了一个明显的问题:VM:ImageIO_PNG_Data和VM:CoreAnimation类别。
其中一些发生在我使用的一个名为遮罩视图的类中,它绘制了该视图下方的指定部分层。用于绘制的代码如下所示:
//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(context); - maelswarm
释放上下文会导致错误,我认为这是由于过度释放造成的,因为这是ARC:CGContextResetState:无效上下文0x9296780。这是一个严重的错误。此应用程序或其使用的库正在使用无效的上下文,从而有助于整体系统稳定性和可靠性的降级。此通知是一种礼貌:请解决此问题。在即将推出的更新中,它将变成致命错误。 - Stephen Donnell
你想使用Leaks工具来运行它,而不是Allocations。最大的泄漏物往往也不是造成泄漏的原因。 - tc.
我之前用Leaks对它进行了分析,希望能找到一些线索,但返回的结果是0个泄漏对象。这可能是让我感到困惑的最大问题。 - Stephen Donnell
1
问题可能不是内存泄漏,而只是被遗弃的内存。这意味着您仍然从某个地方拥有对图像的有效引用,但无法再访问它。尝试在主视图控制器上进行一些代际分析(也称为堆快照分析)- https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/MemoryManagementforYouriOSApp/MemoryManagementforYouriOSApp.html - Anurag
1个回答

2

内存增长问题大多数情况下是由以下两种方式引起的:

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

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

  1. 检查您是否正在使用更新的懒加载库。

使用内存分配工具并检查VM分配,如果出现任何IMAGEIO相关问题,则您肯定已经包含了高分辨率图像在NSMainBundle中。

将高分辨率图像调整为所需分辨率,并使用imageWithContentsOfFile而不是imageName。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接