【发布时间】: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 仍然存在。
所以有两个问题。
- 我应该如何管理图像的保留/释放?
- 我应该在哪里发布 VC3,我如何确定其他东西不会保留它,例如NSTimer 什么的。
【问题讨论】:
标签: ios memory-management uiimageview uiimage