У меня есть приложение, которое отображает два полноэкранных изображения по одному за один раз в UIImageView
. Когда пользователь отбирает первое изображение, он исчезает, и появляется следующий. После отображения второго изображения он очищается и изображение не отображается, и, надеюсь, в памяти ничего не остается.Данные UIImageView сохраняются, несмотря на удаление изображения
Однако, анализируя приложение в Инструментах, я вижу, что каждое изображение занимает около 12 МБ памяти, но оно кумулируется. 12 МБ, когда отображается первое изображение, 24 МБ, когда отображается второе изображение, а затем 24 МБ остается после очистки изображения. Я боролся с этим в течение некоторого времени и не могу видеть, где эти данные сохраняются.
Свежий набор глаз на этот код будет потрясающим. Это метод, который вызывается каждый раз, когда пользователь удаляет изображение:
-(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];
}];
}
}
Спасибо за чтение!
Вы пытались настроить свои экземпляры 'UIImageView' на' nil' после того, как вы удалите FromSuperview'? Я думаю, у вас, вероятно, есть «сильная» ссылка, которая не освободит память, пока владелец жив. – mbm29414
Привет @ mbm29414, спасибо за комментарий. Я действительно, но, к сожалению, не повезло. – Rogare