iOS: сбой в reoloaddata представления коллекции с UIImage

В моем приложении у меня есть этот код:

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
    return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return images.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

    static NSString *identifier = @"gallerycell";

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    UIImageView *backImageCell = (UIImageView*)[cell viewWithTag:100];
    [backImageCell setImage:[images objectAtIndex:indexPath.item]];

    if([indexPath row] == ((NSIndexPath*)[[collectionView indexPathsForVisibleItems] lastObject]).row){

[activity_view stopAnimating];
        [UIView animateWithDuration:0.8 animations:^{
            back.alpha = 0;
        }];
    }

    return cell;
}

массив изображений содержит UIImage размером 200x150, а их размерность в килобайтах составляет около 42 КБ, это обычный массив UIImage.

Когда я перезагружаю данные для этого представления коллекции, у меня появляется предупреждение памяти после 15 изображений... есть ли способ (как поток), чтобы не иметь предупреждения памяти?

2 ответа

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

Альтернативы:

  1. Хранить имена изображений в массиве
  2. Сохранить путь к файлу в массиве
  3. Сохраните URL-адрес изображения в массиве и используйте методы Async для загрузки изображения в UITableView или же UICollectionView

В дополнение к изменению размера изображений, вы можете обнулять изображение, когда ячейка прокручивается вне поля зрения - просто реализуйте:

- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath 

Кроме того, хитрость в поддержании кэша, который не будет перегружать систему, заключается в том, чтобы сделать, как предложил Мидхун в комментариях - используйте imageWithContentsOfFile, Затем создайте NSCache и вставьте в него изображения с помощью имени изображения или другого идентифицирующего ключа. Когда вам нужно изображение, если оно в кеше, вытащите его. Если нет, вы можете снова прочитать его из файловой системы. iOS очистит NSCache, если ему потребуется больше памяти.

Другие вопросы по тегам