2011-12-20 2 views
0

Я пытаюсь создать средство просмотра фотографий, например приложение Apple Photos в iOS. Макет в порядке, но он получает предупреждение о памяти, а затем сбой. Зачем? Это происходит даже при загрузке 7/8 изображений из папки документов приложения. Нужно ли мне управлять памятью с помощью конкретной системы? Я использую ARC с прошивкой 5.iOS - Создайте Photo Viewer, как приложение для фотографий

РЕДАКТИРОВАТЬ:

Код:

for (int i=0; i<[dataSource count]; i++) { 
     UIButton *button=[UIButton buttonWithType:UIButtonTypeCustom]; 
     [button setImage:[dataSource objectAtIndex:i] forState:UIControlStateNormal]; 
     [[button titleLabel] setText:[NSString stringWithFormat:@"%i",i+1]]; 
     [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
     [[button layer] setBorderWidth:1]; 
     [[button layer] setBorderColor:[UIColor darkGrayColor].CGColor]; 
     if (i==0) { 
      [button setFrame:CGRectMake(x, y, width, height)]; 
     } else { 
      if (i%5==0) { 
       nRow++; 
       x=18; 
       [button setFrame:CGRectMake(x, (y*nRow), width, height)]; 
      } else { 
       [button setFrame:CGRectMake(x+space+width, (y*nRow), width, height)]; 
       x=button.frame.origin.x; 
      } 
     } 
     [[self view] addSubview:button]; 
    } 

Основная часть этого кода первые 6 строк, после того, как это все х и у. dataSource - это NSArray, объявленный как свойство (неатомный, сильный). Он содержит объекты UIImage.

+0

@ user523234 код добавлен –

+0

@ user523234 простой Получите предупреждение памяти, а затем падает –

ответ

0

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

Для реализации:

  1. Держите путь к файлам изображений в вашем массиве данных вместо объектов UIImage. Получите изображение с пути, используя imageWithContentsOfFile: когда вам это нужно.
  2. Загрузите первые z кнопки в прокрутку, где z - это число, которое появляется на экране одновременно, плюс стоимость одной строки.
  3. Установите UIViewController, в котором мы сейчас находимся в качестве делегата scrollview, и реагируем на изменения смещения, перемещая кнопки и устанавливая соответствующие изображения и цели.

Кроме того, если 7/8 изображений сбой вашего приложения, похоже, что вы имеете дело с некоторыми довольно большими файлами изображений. Попробуйте предоставить версии содержимого в каталоге документов (независимо от размера ваших кнопок ТОЧНО), или если изображения являются динамическими, см. this post для практического руководства.

0

Если вы, вероятно, с помощью ImageNamed, эта статья помогла мне много:

http://www.alexcurylo.com/blog/2009/01/13/imagenamed-is-evil/

В основном

НЕ ИСПОЛЬЗОВАТЬ [UIImage imageNamed] для любого значительного количества изображений. Это ЗЛО. Это приведет к снижению вашего приложения и/или Springboard даже тогда, когда ваше приложение использует только чуть-чуть кусок памяти самостоятельно.

и

это лучше реализовать свой собственный кэш

и вот предлагаемый кэшированные пример изображения:

- (UIImage*)thumbnailImage:(NSString*)fileName 
{ 
    UIImage *thumbnail = [thumbnailCache objectForKey:fileName]; 

    if (nil == thumbnail) 
    { 
     NSString *thumbnailFile = [NSString stringWithFormat:@"%@/thumbnails/%@.jpg", [[NSBundle mainBundle] resourcePath], fileName]; 
     thumbnail = [UIImage imageWithContentsOfFile:thumbnailFile]; 
     [thumbnailCache setObject:thumbnail forKey:fileName]; 
    } 
    return thumbnail; 
} 
+0

я не использую imageNamed –

+0

@ BartłomiejSemańczyk спасибо за приглашение, я обновил свой ответ – 321zeno

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