Завершено из-за давления памяти при использовании 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;
}

Изображения, которые вы загружаете из библиотеки ресурсов, будут большими. Если вы пытаетесь загрузить многие из них в виде таблицы, то у вас быстро не хватит памяти. Обычная практика - создавать масштабированные изображения из больших изображений, которые используют намного меньше памяти.

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