使用 UICollectionView 收到内存警告以查看图像

Posted

技术标签:

【中文标题】使用 UICollectionView 收到内存警告以查看图像【英文标题】:Received Memory Warning with UICollectionView to view Images 【发布时间】:2014-04-20 16:44:41 【问题描述】:

我创建了一个 UICollectionView 来水平查看 ALAsset。 ALAssets 首先存储到一个名为assets 的 MutableArray 中。然后collection View通过这个方法展示这些Assets。

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath;

    AssetCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath];

    cell.backgroundColor = [UIColor redColor];

    ALAsset *asset = self.assets[indexPath.row];
    ALAssetRepresentation *rep = [asset defaultRepresentation];
    CGImageRef iref = [rep fullResolutionImage];
    UIImage *largeimage = [UIImage imageWithCGImage:iref];
    cell.imageView.image = largeimage;

    return cell;

但是资产集合超过 100 张图片,应用程序给我一个内存警告。内存使用量也增加了 50MB 以上。如何摆脱这种巨大的内存使用?我在这里做错了什么?

【问题讨论】:

【参考方案1】:

您错过了您创建的 CGImage 的发布。

ALAsset *asset = self.assets[indexPath.row];
ALAssetRepresentation *rep = [asset defaultRepresentation]; 
CGImageRef iref = [rep fullResolutionImage]; //! creates
UIImage *largeimage = [UIImage imageWithCGImage:iref];
cell.imageView.image = largeimage;
CGImageRelease(iref); //! release

【讨论】:

附注:不要加载超过 1 个 fullScreenImage 并且永远不要显示 fullResolutionImages,除非你真的需要 + 收听 didReceiveMemoryWarnings(尤其是在处理大图像时) 最后但并非最不重要的一点:懒惰总是获胜.. 仅在您真正需要时才加载它 - cellForItem 被调用得太快、太频繁并且项目被缓存的时间太长 我仍然收到内存警告。我应该降低 fullResolutionImage 的质量然后显示吗?? 是的,但不是使用 UIImageView,而是让单元格使用 MyCustomAssetView。将缩略图加载到其中并让它仅在显示时加载 fullScreenImage【参考方案2】:

您应该避免创建尺寸大于 1024 x 1024 的 UIImage 对象。 (苹果 SDK 指南) 我猜这是因为您尝试一次加载大量大图像。

因此,如果您只想在主集合视图中显示图像,则可以改用 ALAsset 类的缩略图。

当用户触摸其中一张图片时,此时显示“fullResolutionImage”。

【讨论】:

以上是关于使用 UICollectionView 收到内存警告以查看图像的主要内容,如果未能解决你的问题,请参考以下文章

收到内存警告时 UICollectionView 维护的单元队列会发生啥?

UICollectionView 在滚动时收到内存警告

如何显示自定义警报以在 ios 中启用通知

使用 UICollectionView 和 MPMediaItemArtwork 遇到内存泄漏

滚动 UICollectionView 使用大量内存导致崩溃

UICollectionView 收到具有不存在索引路径的单元格的布局属性