Я помещаю слишком много в мой NSMutableArray?Пожалуйста помоги! - PullRequest
3 голосов
/ 13 февраля 2011

Так что я делаю приложение очень быстрым, и хотя это не лучшее решение, оно, похоже, работает по большей части.Таким образом, у меня есть простое представление изображения, которое вытягивает изображение из NSMutableArray arr.Я создаю массив и заполняю его внутри ViewDidLoad следующим образом:

arr = [[NSMutableArray alloc] init];

[arr addObject:[UIImage imageNamed:@"181940jpg"]];
[arr addObject:[UIImage imageNamed:@"168026.jpg"]];
[arr addObject:[UIImage imageNamed:@"168396.jpg"]];
[arr addObject:[UIImage imageNamed:@"168493_.jpg"]];

И я продолжаю делать это для 130 изображений.Очевидно, это большой массив.Я не знаю, если это действительно плохой способ сделать это, но если это так, я открыт для предложений!Когда я просматриваю массив с помощью нескольких простых кнопок «назад» и «вперед», вытаскивающих изображения из массива на основе простой переменной счетчика, все работает нормально, пока изображение не станет 45-ти.Приложение выходит из строя, и консоль говорит следующее:

* ОШИБКА: заголовок ImageIO 'ImageProviderCopyImageBlockSetCallback' не является CFDictionary ...

Поможет ли это, если я сломаю свойизображения в отдельные массивы?Я просто кладу слишком много в массив?Что мне здесь не хватает, поверьте мне, я весь слух.

Спасибо

РЕДАКТИРОВАТЬ: Вот еще немного информации

Вот как я просеиваю через массив,используя UISegmentedControl, установленный в верхней части экрана:

  -(void) pickedOne{
if(segmentedControl.selectedSegmentIndex == 1){
    NSLog(@"hey");
    if(position < [arr count]-1){

        position++;//This is my global counter variable
        UIImage * img = [arr objectAtIndex:position];
        [imageView setImage:img];
        [img release];
    }       

}else if(segmentedControl.selectedSegmentIndex ==0){

    if(position >0){

        position--;
        UIImage * img = [arr objectAtIndex:position];
        [imageView setImage:img];
        [img release];
    }       

}
  }

Похоже, что это не проблема с управлением памятью, но опять же, я не считаю себя профессионалом в этом каким-либо образом...

1 Ответ

4 голосов
/ 13 февраля 2011

В терминах изменяемого массива вы помещаете в него просто указатель на какой-то другой объект.Вы должны беспокоиться о других объектах, и, да, у вас их слишком много (скорее всего, чем нет).

  • ОШИБКА: заголовок ImageIO 'ImageProviderCopyImageBlockSetCallback' не является CFDictionary...

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

Это больше похоже на то, что у вас проблема с избыточным выпуском и вы передаете что-то поддельное API-интерфейсам ImageIO.

И, фактически, это именно то, что у вас есть:

    UIImage * img = [arr objectAtIndex:position];
    [imageView setImage:img];
    [img release];

Что release является ложным;это не уравновешивает сохранение в любом месте вашего кода.objectAtIndex: не возвращает сохраненный объект, а UIView позаботится о сохранении / освобождении изображения внутри.

Удалите это release (и другое тоже)!

Вам все еще нужно беспокоиться о потреблении памяти.При размере 42 КБ каждый (не необоснованный, но полностью составленный) 130 изображений будут весить ~ 6 МБ или около того, перед любой декомпрессией или другим расширением, которое происходит как часть хранилища.

Устройства ограничены в памяти.

...