2015-01-22 3 views
1

У меня есть приложение, которое отображает два полноэкранных изображения по одному за один раз в 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]; 
         }]; 
    } 

} 

Спасибо за чтение!

+1

Вы пытались настроить свои экземпляры 'UIImageView' на' nil' после того, как вы удалите FromSuperview'? Я думаю, у вас, вероятно, есть «сильная» ссылка, которая не освободит память, пока владелец жив. – mbm29414

+0

Привет @ mbm29414, спасибо за комментарий. Я действительно, но, к сожалению, не повезло. – Rogare

ответ

2

Это реализация -[UIImage imageNamed:], которая хранит кэш всех загруженных изображений.

В документации есть пункт, который описывает то, что происходит в вашем коде:

Если у вас есть файл изображения, который будет отображаться только один раз и хотите убедиться, что он не добавляется к кеш системы, вы должны создать свое изображение, используя imageWithContentsOfFile:. Это позволит сохранить одноразовый образ из кеша системы, что потенциально улучшит характеристики использования вашего приложения.

Но если вы хотите иметь хорошую производительность, почти всегда лучше использовать системный кеш. Загрузка изображения размером 12 МБ может занять более 16 мс и приведет к задержке пользовательского интерфейса.

+0

Привет @ Маты, спасибо за это - это имеет смысл. Из интереса, был ли способ в Инструментах подключить строку «imageIO_PNG_Data», к которой я обращался, к этой строке «imageNamed:»? – Rogare

Смежные вопросы