Плохой доступ к UICollectionView -> UICollectionViewData _setLayoutAttributes:atGlobalIndex:
Я использую UICollectionView для отображения большого количества изображений с партией 32. Каждый раз, когда я достигаю конца представления коллекции, я загружаю другую партию из 32 изображений и изменяю размер collectionView contentsize.width, чтобы принимать новые элементы. Загрузка осуществляется путем вызова веб-службы с AFNetworking.
Когда я прокручиваю очень быстро от начала до конца и до конца и до начала, я получаю EXC_BAD_ACCESS. Это также произошло, когда достигли конца CollectionView. Как будто он пытается загрузить некоторые атрибуты, которые еще не доступны. Я пытался понять это с 1 дня безуспешно. Я пытался с инструментом / NSZombie включен / guardmalloc ...
РЕДАКТИРОВАТЬ
Существует также очень странная мысль: этот плохой доступ появился только тогда, когда я заменил PSTCollectionView реальным UICollectionView. Таким образом, чтобы быть уверенным, что я только что сделал обратный ход и заменил UICollectionView на PSTCollectionView, и ошибка исчезла. Я полностью потерян:)
КОНЕЦ РЕДАКТИРОВАНИЯ
Я использую как дуги, так и не дуговые файлы в проекте. Единственная мысль, которую я могу определить, - это трассировка стека:
Ваша помощь будет более чем приветствовать.
Blockquote
1 ответ
Проблема может заключаться в том, что изображения слишком велики. Что вы можете сделать, это изменить размер изображения из загруженного изображения перед установкой свойства изображения в каждом UIImageView.
Билл Дадни опубликовал очень полезную книгу iBook на эту тему, в которой подробно рассматриваются последствия изображений для памяти и способы их оптимизации. Это $4,99 и очень полезно.
https://itunes.apple.com/us/book/all-image-io-you-need-to-know/id601759073?mt=11
Следующий метод изменит размер изображения до заданного размера, что уменьшит объем памяти и, надеюсь, предотвратит вашу проблему.
- (UIImage *)resizeImage:(UIImage *)image size:(CGSize)size {
UIGraphicsBeginImageContext(size);
[image drawInRect: CGRectMake(0, 0, width, height)];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resizedImage;
}
Теперь, если вы используете AFNetworking для установки изображения непосредственно из URL-адреса с использованием категории AFNetworking, вы можете использовать альтернативный метод, чтобы вы могли вмешаться и изменить размер изображения. Код ниже сделает это.
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:imageURL];
[request addValue:@"image/*" forHTTPHeaderField:@"Accept"];
[imageView setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
// resize image
// set image on imageView
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
// handle error
}];