Проблема с памятью или что-то еще? - PullRequest
2 голосов
/ 01 августа 2011

На моем iPad запущено приложение, которое загружает изображения в карусель. Всего 138 изображений. Если я уменьшу это число до 100, приложение загрузится нормально. Однако на 138 приложение приостанавливается, а не вылетает.

ViewDidLoad и первый оператор for достигаются, как указано точкой останова. Проблема заключается во втором for утверждении.

    // loading images into the queue

loadImagesOperationQueue = [[NSOperationQueue alloc] init];
NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithCapacity:14];

for (int i = 0; i < 137; i++) {
    [tmpArray addObject:[NSString stringWithFormat:@"cover_%d.jpg", i]];
}

for (int i = 0; i < 137; i++) {
    int index = arc4random() % [tmpArray count];
    NSString *imageName = [tmpArray objectAtIndex:index];
    [tmpArray removeObjectAtIndex:index];
    [(AFOpenFlowView *)self.view setImage:[UIImage imageNamed:imageName] forIndex:i];
}

Я предполагаю, что есть проблема с памятью, хотя, поскольку я использую iOS 5 с ARC , мне не нужно было заниматься каким-либо ручным управлением памятью.

Может ли быть так, что слишком много много будет храниться в памяти? Это 138 изображений при ~ 146 КБ на человека. Это примерно 20 МБ, но я не думаю, что это само по себе может вызвать проблему.

GDB завершает работу без какого-либо полезного вывода, фактически без вывода вообще. Запуск инструментов показывает, что при паузе реальное использование памяти составляет всего 6,11 МБ, 77,4% ЦП, но 175 МБ виртуальной памяти.

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

1 Ответ

5 голосов
/ 01 августа 2011

Похоже, ваше приложение убито, потому что занимает слишком много памяти.Действительно, 20 МБ - это предел, который я испытал, и это также соответствует тому, что вы могли бы найти, прибегая к помощи.изображения в памяти в жестком цикле, который не возвращает управление в основной цикл.Таким образом, у вас нет возможности получить сообщение didReceiveMemoryWarning.

Решение довольно простое: предварительно загрузите несколько изображений, а по мере продвижения по карусели предварительно загрузите еще несколько изображенийодновременно выпуская старые.На самом деле, вам не нужно иметь в памяти более 5 изображений одновременно, чтобы шарики работали.Если вас беспокоит отсутствие необходимости загружать изображения почти каждый раз, вы можете увеличить это число.

...