Завершено из-за давления памяти при использовании AssetsLibrary.framework
Я использую AssetsLibrary.framework для извлечения изображений из галереи устройства. Я успешно извлек все изображения из галереи и отобразил в виде таблицы. Проблема возникает, когда я много раз прокручиваю вверх и вниз, я получаю предупреждение о проблеме с памятью, которое печатается на консоли и после Через некоторое время он падает, говоря, разбито из-за давления в памяти.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
ALAsset *asset = [self.images objectAtIndex:indexPath.row];
ALAssetRepresentation *representation = [asset defaultRepresentation];
image=[UIImage imageWithCGImage:[representation fullResolutionImage]];
[selectedAllImages addObject:image];
url = [representation url];
NSURL *imageURL=url;
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
ALAssetRepresentation *representation = [myasset defaultRepresentation];
fileName = [representation filename];
cell.cellLabel.text=fileName;
};
assetslibrary = [[ALAssetsLibrary alloc] init];
[assetslibrary assetForURL:imageURL
resultBlock:resultblock
failureBlock:nil];
[cell.cellImageView setImage:[UIImage imageWithCGImage:[asset thumbnail]]];
return cell;
}
Так что мне нужна помощь, где ошибка? Спасибо
2 ответа
ALAssetRepresentation *representation = [asset defaultRepresentation];
image=[UIImage imageWithCGImage:[representation fullResolutionImage]];
[selectedAllImages addObject:image];
url = [representation url];
Почему вы получаете fullResolutionImage в методе cellForRowAtIndexPath? И положить в массив selectedAllImages.. похоже, что массив selectedAllImages заполняется на бесконечность fullresolutionimages (во время прокрутки).
assetslibrary = [[ALAssetsLibrary alloc] init];
[assetslibrary assetForURL:imageURL
resultBlock:resultblock
failureBlock:nil];
Почему вы создаете библиотеки ресурсов и запрашиваете один и тот же ресурс (который имеет одинаковый URL)?
Я думаю, что вы должны упростить ваш метод cellForRowAtIndexPath, чтобы сделать его более легким во время прокрутки. Что-то вроде этого:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
ALAsset *asset = [self.images objectAtIndex:indexPath.row];
ALAssetRepresentation *representation = [asset defaultRepresentation];
cell.cellLabel.text = [representation filename];
cell.cellImageView.image = [UIImage imageWithCGImage:[asset thumbnail]];
return cell;
}
Изображения, которые вы загружаете из библиотеки ресурсов, будут большими. Если вы пытаетесь загрузить многие из них в виде таблицы, то у вас быстро не хватит памяти. Обычная практика - создавать масштабированные изображения из больших изображений, которые используют намного меньше памяти.