2012-03-21 102 views
0

我有一个iOS应用程序出现问题,应用程序使用的内存(如Instrument上的Allocations中所示)与设备本身使用的内存完全不同步。我看到了我无法避免的内存警告和崩溃。iOS应用程序内存vs设备内存

该应用程序结构非常简单。三个UIViewControllers和一个UINavigationController。用户从具有几个按钮的第一个VC开始,导航到第二个VC,该VC具有大约20个附加到按钮的缩略图图像。在点击一个按钮时,用户进入第三个具有几个高分辨率图像的VC,通常是900×600像素的PNG。

如果我在我的iPod Touch或iPhone 4S上运行应用程序,Instrument/Allocations中的故事几乎相同。它开始于1MB以下,在查看了大约20个高分辨率图像后,内存大约高达1.5MB,但是我开始获得内存警告,并且之后很快就会崩溃。

我检查了泄漏工具,但没有什么比偶尔泄漏几个kB。

但是,如果我看看乐器中的活动监视器,它将是一个完全不同的故事。我可以看到,当应用程序启动时,系统为它分配大约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或其他东西。

回答

0

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

解决方案是要更确切地确保我释放我分配的任何东西。当我这样做时,我能够多次访问第三个VC而没有大量的内存增加。