【问题标题】:iOS App Memory vs Device MemoryiOS 应用内存与设备内存
【发布时间】:2012-04-06 04:54:54
【问题描述】:

我有一个 iOS 应用程序的问题,该应用程序使用的内存(如 Instruments 上的分配所示)与设备本身使用的内存完全不同步。我看到了似乎无法避免的内存警告和崩溃。

该应用程序的结构非常简单。三个 UIViewController 和一个 UINavigationController。用户从第一个 VC 开始,它有几个按钮,导航到第二个 VC,它有大约 20 个附加到按钮的缩略图。点击按钮后,用户会转到第三个 VC,其中包含一些高分辨率图像,通常是 900 x 600 像素的 PNG。

如果我在我的 iPod Touch 或 iPhone 4S 上运行该应用程序,则 Instruments/Allocations 中的情况几乎相同。它从不到 1MB 开始,在查看了大约 20 张高分辨率图像后,内存高达 1.5MB 左右,但我开始收到内存警告,之后应用程序很快就会崩溃。

我已经检查了泄漏工具,但只是偶尔泄漏了几 kB。

但是,如果我查看 Instruments 中的活动监视器,情况就完全不同了。我可以看到,当应用程序启动时,系统为其分配了大约 15MB,但是当我查看越来越多的图像时,使用量继续增加,直到它使用了设备可用的所有东西,此时我收到内存警告和应用程序崩溃,Springboard 也是如此,并且设备返回到“滑动打开”屏幕。

显然,我怀疑图像被保留了。

我正在使用以下内容来创建图像:

 layer1 = [[UIImageView alloc] initWithFrame:myCGRect];

    UIImage *img1 = [[UIImage alloc]initWithContentsOfFile:imgName];

    layer1.image = img1;
    layer1.opaque = YES;
    [self.view addSubview:layer1];
    [img1 release];
    img1 = nil;

layer1 是一个 UIImageView,它是 VC 的一个属性。我在 dealloc 中释放它。

但看起来我这样做是错误的,因为当我从 VC3 返回 VC2 时,VC3 仍然存在。

所以有两个问题。

  1. 我应该如何管理图像的保留/释放?
  2. 我应该在哪里发布 VC3,我如何确定其他东西不会保留它,例如NSTimer 什么的。

【问题讨论】:

    标签: ios memory-management uiimageview uiimage


    【解决方案1】:

    这里的问题是我没有释放第三个视图控制器,所以每次我导航回它时,它都会创建一个新实例,以及所有保留的图像。

    解决方案是更准确地确保我释放了我分配的任何内容。当我这样做时,我能够多次导航回第三个 VC,而不会大量增加内存。

    【讨论】:

      猜你喜欢
      • 2012-05-08
      • 2011-09-07
      • 1970-01-01
      • 2016-08-17
      • 2014-07-13
      • 1970-01-01
      • 2020-07-13
      • 2011-05-02
      • 1970-01-01
      相关资源
      最近更新 更多