使用 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 和 MPMediaItemArtwork 遇到内存泄漏