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 ответа
Не храните изображения в массиве, это не очень хорошая практика. По мере увеличения количества изображений или их размера выдается предупреждение о сбое памяти.
Альтернативы:
- Хранить имена изображений в массиве
- Сохранить путь к файлу в массиве
- Сохраните URL-адрес изображения в массиве и используйте методы Async для загрузки изображения в
UITableView
или жеUICollectionView
В дополнение к изменению размера изображений, вы можете обнулять изображение, когда ячейка прокручивается вне поля зрения - просто реализуйте:
- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
Кроме того, хитрость в поддержании кэша, который не будет перегружать систему, заключается в том, чтобы сделать, как предложил Мидхун в комментариях - используйте imageWithContentsOfFile
, Затем создайте NSCache и вставьте в него изображения с помощью имени изображения или другого идентифицирующего ключа. Когда вам нужно изображение, если оно в кеше, вытащите его. Если нет, вы можете снова прочитать его из файловой системы. iOS очистит NSCache, если ему потребуется больше памяти.