我的iOS应用程序存在问题,其中应用程序使用的内存(如仪器上的分配所示)与设备本身使用的内存完全不同步。我看到内存警告和崩溃似乎无法避免。
该应用程序结构非常简单。三个UIViewControllers和一个UINavigationController。用户从具有几个按钮的第一个VC开始,导航到第二个VC,该VC具有附加到按钮的大约20个缩略图图像。在点击按钮时,用户转到第三个VC,其中包含一些高分辨率图像,通常为900 x 600像素的PNG。
如果我在iPod Touch或iPhone 4S上运行应用程序,则仪器/分配中的故事几乎相同。它开始时只有不到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仍然存在。
所以有两个问题。
答案 0 :(得分:0)
这里的问题是我没有发布第三个视图控制器,因此每次我导航回它时,它都会创建一个新实例,以及所有保留的图像。
解决方案是更精确地确保我发布了我分配的任何东西。当我这样做时,我能够多次导航回第三个VC而不会增加大量内存。