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:
行代码?