Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIImageView数据在删除图像后仍然存在_Ios_Objective C_Memory_Uiimageview_Instruments - Fatal编程技术网

Ios UIImageView数据在删除图像后仍然存在

Ios UIImageView数据在删除图像后仍然存在,ios,objective-c,memory,uiimageview,instruments,Ios,Objective C,Memory,Uiimageview,Instruments,我有一个应用程序,在一个UIImageView中显示两个全屏图像,一次一个。当用户轻触第一幅图像时,它会淡出并显示下一幅图像。在显示第二个图像后,它将被清除,并且不会显示新图像,希望内存中不会保留任何内容 然而,在Instruments中分析应用程序时,我发现每个图像占用大约12MB的内存,但它会累积。第一个图像显示时为12 MB,第二个图像显示时为24 MB,清除图像后24 MB仍保留。我已经为此绞尽脑汁一段时间了,看不出这些数据被保留在哪里 重新审视这段代码将是非常棒的。这是用户每次点击图像

我有一个应用程序,在一个
UIImageView
中显示两个全屏图像,一次一个。当用户轻触第一幅图像时,它会淡出并显示下一幅图像。在显示第二个图像后,它将被清除,并且不会显示新图像,希望内存中不会保留任何内容

然而,在Instruments中分析应用程序时,我发现每个图像占用大约12MB的内存,但它会累积。第一个图像显示时为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];
                         }];
    }

}
-(无效)显示图像{
[self.slideshowImage setUserInteractionEnabled:是];
int imageNumber=(int)self.slideshowImage.tag;
//淡入第一图像
如果(imageNumber==0){
self.slideshowImage.alpha=0;
[self.slideshowImage setImage:[UIImage ImageName:[slideshowImages对象索引:imageNumber]];
[UIView animateWithDuration:0.3
动画:^(无效){
self.slideshowImage.alpha=1;
}
完成:^(布尔完成){
self.slideshowImage.tag=imageNumber+1;
}];
//淡出当前图像,淡入下一图像

}else if(imageNumber的实现是保留已加载的所有图像的缓存

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

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


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

从SuperView中移除
后,您是否尝试过将
UIImageView
实例设置为
nil
?我想您可能有一个
strong
参考nce,只要所有者还活着,它就不会释放内存。嗨@mbm29414,谢谢你的评论。我确实这么做了,但不幸的是没有运气。嗨@Mats,谢谢这完全有意义。出于兴趣,仪器中有没有办法让我连接“imageIO_PNG_数据”第一行是关于
imageNamed:
行代码?