Утечка памяти с большим количеством больших изображений в iPad - PullRequest
1 голос
/ 22 ноября 2011

Я пытаюсь сохранить UIImage данных в NSArray , на самом деле 60 изображений, каждое размером 300 КБ. Затем я пытаюсь анимировать эти изображения в UIImageView .

Мой код:

    NSMutableArray *arr = [[NSMutableArray alloc] init];
    for (int i=0; i<61; ++i) {
        [arr addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%i.png", i]]];
    }

    img.animationImages = arr;
    img.animationDuration = 1.5;
    img.contentMode = UIViewContentModeBottomLeft;
    [img startAnimating];


Когда я тестирую его в iPad Simulator 4.3, он работает нормально.
Когда я хочу проверить его на своем устройстве (iPad 1), приложение вылетает .

Примечание: Приложение не падает, если я прокомментирую этот код: [img startAnimating];

1. В чем может быть проблема? Я думаю, что это проблема с памятью ...?!
2. Могу ли я хранить лупы UIImages в NSArray?

Ответы [ 3 ]

4 голосов
/ 22 ноября 2011

Ваши png-файлы могут иметь размер 300 КБ, но это формат сжатия.

Чтобы получить представление о размере самого изображения, вы должны умножить ширину, высоту и количество байтов на пиксель.

т.е. Если изображение имеет размер 1024 * 1024 и модель RGBA, само изображение имеет размер 4 МБ в памяти. И это только одно изображение. Если у вас есть 300, это около 120 МБ.

Примечание: это только приблизительное правило, но оно дает вам представление.

Таким образом, вы должны хранить имена путей в массиве и загружать изображение только в случае необходимости, а миниатюры должны быть изменены и сохранены на диске в виде файлов. Не просто масштабируйте UIImageView.

Вот отличная статья с кодом об изменении размера.

1 голос
/ 23 ноября 2011

Я решил проблему сбоя приложения альтернативным способом: я попытался использовать простой NSTimer . Для каждой итерации я устанавливаю n-ное изображение на UIImageView :

  • У меня есть UIImageView в xib-файле, указывающем на переменную img .
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:.03 
                            target:self 
                            selector:@selector(tiktak) 
                            userInfo:nil repeats:YES];
int n = 0;

-(void)tiktak {
    n++;
    img.image = [UIImage imageNamed:
                   [NSString stringWithFormat:@"Blue Menu_%i.png", n]];
    if(nn == 60) nn = 0;
}


Анимация потрясающая. Я также проверил это в Activity Monitor, загрузка процессора составляет 6% и менее.

0 голосов
/ 22 ноября 2011

Я бы не советовал вам хранить столько UIImages в NSArray, он слишком тяжелый и неэффективный.Откуда эти изображения (комплект, интернет, галерея устройства)?

Редактировать: я не знаю, как вы хотите, чтобы он выглядел, но вы можете создать массив с именами UIImages, а затем загрузить UIImage и показать его.Как это:

for(i=0;i<60;i++){
 NSString *nameOfPicture=[NSString stringWithFormat:@"picture_%d",i+1]
 [array addObject:nameOfPicture];
}
...