【发布时间】: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