iOS 7应用程序因内存压力而终止

时间:2014-01-31 01:07:45

标签: ios objective-c memory-management

我有一个使用大型UIScrollowView的ipad App的两个视图,这似乎导致了内存问题。当内存达到250MB左右时,我收到了第一个内存警告。使用Apple Instruments时,这里是All Heap中最大的:

VM:ImageIO_JPEG_Data,大小为32.13MB VM:CoreAnimation,大小32.13MB VM:ImageIO_JPEG_Data,大小26.64MB ...

我在滚动视图中有很多图像 - 它们都被加载到故事板中,我想知道如果我减小图像的大小或分辨率它会解决问题吗?

2 个答案:

答案 0 :(得分:3)

您可以设置一个系统来删除/加载滚动视图中某些点的某些图像,因此当用户即将看到它们时,应用程序只将它们存储在内存中。

因为你说它相当大,在scrollview的scroll方法中,设置变量以了解scrollview所处的位置(例如:中途向下,10%滚动等)。如果用户坐在滚动视图的末尾(即:无法向下滚动(100%)),那么他们并没有完全看到视图顶部的图像。然后,您可以将这些图像设为零,以便应用程序可以重复使用该内存。当用户滚动并且滚动视图接近某个百分比时,您可以加载用户即将看到的图像,并且用户远离的图像为零(这可能会导致几秒钟的'空白'用户正在疯狂地滚动浏览你的应用程序,但这没关系,因为图像加载所需的时间不会超过几秒钟。

因为这些图像被加载到故事板中,所以我假设你是通过UIImageView加载它们的。只需给每个插座一个插座(按住控件+单击并将其拖动到您班级的.h文件并创建一个IBOutlet),然后当您有用户向下滚动视图的百分比时,您可以知道'好吧,用户是在50%所以我可以摆脱0-20%和80-100%的scrollview'的图像, 你这样做:

//^Get scrollview scrolled percentage
//^find out where the user is, get a list of UIImageViews that are not visible on the screen  
_yourUIImageView.image = nil //get rid of the image, clear memory up
//then when you need to add it again, assign an image to the UIImageview

希望我帮助过。

答案 1 :(得分:1)

最大值不在Storyboard中加载图像, 相反,你可以通过编码来完成,如下所示

NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *pathForImageFile1 = [resourcePath stringByAppendingPathComponent:@"filename.png"];
UIImage * image = [[UIImage alloc] initWithContentsOfFile:pathForImageFile1];
imageView.image = image;
image = nil;

希望它有所帮助!