尽管删除了图像,UIImageView数据仍然存在

时间:2015-01-22 12:23:04

标签: ios objective-c memory uiimageview instruments

我有一个应用程序,在一个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];
                         }];
    }

}

感谢阅读!

1 个答案:

答案 0 :(得分:2)

-[UIImage imageNamed:]的实现是保留已加载的所有图像的缓存。

在文档中有一段描述了代码中正在发生的事情:

  

如果您的图像文件只显示一次,并希望确保它不会添加到系统的缓存中,则应使用imageWithContentsOfFile:创建图像。这会将您的一次性图像保留在系统图像缓存之外,从而可能会改善应用程序的内存使用特性。

但是如果你想获得良好的性能,那么使用系统缓存几乎总是更好。加载12MB图像可能需要16ms以上,并会延迟UI。