gpt4 book ai didi

ios - 滚动从远程服务器加载大量图像的 UICollectionView 时如何避免内存问题?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:40:42 26 4
gpt4 key购买 nike

我在 UICollectionView 中显示大量图像(5000 张图像)。这些图像已从远程服务器下载。当我从 UICollectionView 的顶部滚动到底部,反之亦然 5 到 6 次时,我的应用程序崩溃并且我收到错误“由于内存压力而终止应用程序”。请建议解决此问题。

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return urlLists.count;
}


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath];
UIImageView *cellImage=[[UIImageView alloc]init];
cellImage.frame=cell.contentView.bounds;

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[urlLists objectAtIndex:indexPath.row]]];
UIImage *image = [UIImage imageWithData:data];
UIImageJPEGRepresentation(image, 0.1);
data=nil;
dispatch_async(dispatch_get_main_queue(), ^{
cellImage.image=image;
});
});

NSLog(@"The Indexpath=%ld", indexPath.row);
[cell.contentView addSubview:cellImage];

return cell;

}

最佳答案

这里有三个层次的问题:

  1. 最令人震惊的问题是,每次使用单元格时,您都会向该单元格添加一个新的 UIImageView。但是单元格可以重复使用很多次,因此您要向单元格添加许多 ImageView 。与所有其他 ImageView 关联的图像将占用内存。

    在我看来,最简单/最好的解决方案是使用单元格原型(prototype),在其中添加 ImageView ,并且不要以编程方式添加 ImageView 。或者,您可以通过编程方式添加 ImageView ,但请确保您不会每次都添加新的 ImageView 。

    顺便说一下,不要每次都手动实例化一个新单元来关闭单元重用(正如这里其他人可能会建议的那样)。是的,这是一个简单的解决方案,但效率不高。

  2. 一个更微妙的问题是,您正在调用 UIImageJPEGRepresentation,我猜这是为了减少所涉及的内存。那并不像您认为的那样。是的,它创建了一个压缩的 JPEG 表示,但您不对其进行任何操作。你只是在丢弃它。

    如果您想要优化内存并且图像是高分辨率的,请考虑将图像调整为适合单元格的大小。参见 UIImage resizing not working properly以调整类别大小为例。

  3. 考虑使用 SDWebImageUIImageView 类别或 AFNetworking ,它会延迟加载和缓存图像。

    问题中的这段代码在启动异步检索之前不会正确重置 ImageView 。如果在图像检索完成之前重复使用单元格,它将不会处理这种情况。它可能会不必要地重新检索几秒钟前下载的图像。等等

    有很多与优雅地异步检索图像相关的问题,这两个类的 UIImageView 类别会为您处理很多这些细节。

关于ios - 滚动从远程服务器加载大量图像的 UICollectionView 时如何避免内存问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30374373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com