【问题标题】:UIImageView data persists despite removing image尽管删除图像,UIImageView 数据仍然存在
【发布时间】:2015-03-21 05:45:12
【问题描述】:

我有一个应用程序在一个UIImageView 中一次显示两个全屏图像。当用户点击第一张图片时,它会淡出并显示下一张。显示第二张图像后,它被清除,不再显示新图像——希望内存中没有任何内容。

但是,在 Instruments 中分析应用程序时,我发现每个图像需要大约 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];
                         }];
    }

}

感谢阅读!

【问题讨论】:

  • 您是否尝试在您removeFromSuperview 之后将您的UIImageView 实例设置为nil?我想你可能有一个strong 引用,只要所有者还活着,它就不会释放内存。
  • 嗨@mbm29414,感谢您的评论。我确实做到了,但不幸的是没有运气。

标签: ios objective-c memory uiimageview instruments


【解决方案1】:

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

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

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

但如果你想拥有良好的性能,使用系统缓存几乎总是更好。加载 12MB 的图像可能需要超过 16 毫秒,并且会延迟 UI。

【讨论】:

  • 嗨@Mats,谢谢你——这完全有道理。出于兴趣,在 Instruments 中是否有一种方法可以将我正在处理的“imageIO_PNG_Data”行连接到 imageNamed: 代码行?
猜你喜欢
  • 2018-09-16
  • 2018-11-28
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多