由于内存压力而终止使用AssetsLibrary.framework

时间:2014-04-23 06:37:10

标签: alassetslibrary ios7.1 alassetsgroup

我正在使用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 个答案:

答案 0 :(得分:2)

ALAssetRepresentation *representation = [asset defaultRepresentation];
image=[UIImage imageWithCGImage:[representation fullResolutionImage]];
[selectedAllImages addObject:image];
url = [representation url];

为什么在cellForRowAtIndexPath方法中获得fullResolutionImage?并且放入selectedAllImages数组..似乎selectedAllImages数组填充fullresolutionimages infinity(滚动期间)。

assetslibrary = [[ALAssetsLibrary alloc] init];
[assetslibrary assetForURL:imageURL
               resultBlock:resultblock
              failureBlock:nil];

为什么要创建assetslibrary并请求相同的资产(具有相同的网址)?

我认为你应该简化你的< 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;
}

答案 1 :(得分:0)

您从资产库中加载的图片会很大。如果您尝试在表视图中加载其中许多,那么您将很快耗尽内存。通常的做法是从较大的图像创建缩放图像,这些图像使用的内存要少得多。