我有一个应用程序,在一个UIImageView
中一次显示两个全屏图像。当用户点击第一个图像时,它会淡出并显示下一个图像。显示第二个图像后,它将被清除,并且不会显示任何新图像 - 并且希望内存中没有任何内容。
然而,在分析乐器中的应用程序时,我发现每张图像需要大约12 MB的内存,但它会累积。第一张图像显示时为12 MB,第二张图像显示时为24 MB,然后清除图像后仍保留24 MB。我一直在努力解决这个问题,并且无法看到这些数据的保留位置。
对这段代码的一套新观点将是非常棒的。这是每次用户点击图像时调用的方法:
-(void)displayImages{
[self.slideshowImage setUserInteractionEnabled:YES];
int imageNumber=(int)self.slideshowImage.tag;
// Fade in first image
if (imageNumber==0){
self.slideshowImage.alpha=0;
[self.slideshowImage setImage:[UIImage imageNamed:[slideshowImages objectAtIndex:imageNumber]]];
[UIView animateWithDuration:0.3
animations:^(void){
self.slideshowImage.alpha=1;
}
completion:^(BOOL finished){
self.slideshowImage.tag=imageNumber+1;
}];
// Fade out current image, fade in next image
}else if (imageNumber<[slideshowImages count]){
UIImageView *newImage=[[UIImageView alloc] initWithFrame:self.slideshowImage.frame];
[newImage setImage:[UIImage imageNamed:[slideshowImages objectAtIndex:imageNumber]]];
newImage.alpha=0;
[self.view addSubview:newImage];
[UIView animateWithDuration:0.3
animations:^(void){
self.slideshowImage.alpha=0;
}
completion:^(BOOL finished){
[UIView animateWithDuration:0.3
animations:^(void){
newImage.alpha=1;
}
completion:^(BOOL finished){
[self.slideshowImage setImage:[UIImage imageNamed:[slideshowImages objectAtIndex:imageNumber]]];
self.slideshowImage.alpha=1;
[newImage removeFromSuperview];
}];
}];
self.slideshowImage.tag=imageNumber+1;
// Clear image
}else{
[UIView animateWithDuration:0.3
animations:^(void){
self.slideshowImage.alpha=0;
}
completion:^(BOOL finished){
[self.slideshowImage setTag:0];
[self.slideshowImage setImage:nil];
[self.slideshowImage setUserInteractionEnabled:NO];
}];
}
}
感谢阅读!
答案 0 :(得分:2)
-[UIImage imageNamed:]
的实现是保留已加载的所有图像的缓存。
在文档中有一段描述了代码中正在发生的事情:
如果您的图像文件只显示一次,并希望确保它不会添加到系统的缓存中,则应使用
imageWithContentsOfFile:
创建图像。这会将您的一次性图像保留在系统图像缓存之外,从而可能会改善应用程序的内存使用特性。
但是如果你想获得良好的性能,那么使用系统缓存几乎总是更好。加载12MB图像可能需要16ms以上,并会延迟UI。