ios - 滚动从远程服务器加载大量图像的 UICollectionView 时如何避免内存问题?
<p><p>我在 <code>UICollectionView</code> 中显示了很多图像(5k 图像)。这些图像已从远程服务器下载。当我从 <code>UICollectionView</code> 从上到下滚动(反之亦然) 5 到 6 次时,我的应用程序崩溃并且我收到错误“由于内存压力而终止应用程序”。请建议解决此问题。</p>
<pre><code>- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return urlLists.count;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewCell *cell=;
UIImageView *cellImage=[init];
cellImage.frame=cell.contentView.bounds;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *data = [ initWithContentsOfURL:]];
UIImage *image = ;
UIImageJPEGRepresentation(image, 0.1);
data=nil;
dispatch_async(dispatch_get_main_queue(), ^{
cellImage.image=image;
});
});
NSLog(@"The Indexpath=%ld", indexPath.row);
;
return cell;
}
</code></pre></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>这里有三个层次的问题:</p>
<ol>
<li><p>最严重的问题是每次使用单元格时,您都在向单元格添加一个新的 <code>UIImageView</code>。但是单元格可以多次重复使用,因此您要向单元格添加许多 ImageView 。与所有其他 ImageView 关联的图像将占用内存。</p>
<p>在我看来,最简单/最好的解决方案是使用单元原型(prototype),在那里添加 ImageView ,并且不要以编程方式添加 ImageView 。或者,您可以通过编程方式添加 ImageView ,但请确保不要每次都添加新的 ImageView 。</p>
<p>顺便说一句,不要试图通过每次手动实例化一个新单元来关闭单元重用(正如这里其他人可能会建议的那样)。是的,这是一个简单的解决方案,但不是一个有效的解决方案。</p></li>
<li><p>一个更微妙的问题是你调用 <code>UIImageJPEGRepresentation</code> 我猜是为了减少所涉及的内存。这并不像你认为的那样。是的,它创建了一个压缩的 JPEG 表示,但您不使用它做任何事情。你只是丢弃它。</p>
<p>如果您想优化内存并且图像具有高分辨率,请考虑将图像大小调整为适合单元格的大小。见 <a href="https://stackoverflow.com/questions/10491080/uiimage-resizing-not-working-properly/10491692#10491692" rel="noreferrer noopener nofollow">UIImage resizing not working properly</a>例如调整类别大小。</p></li>
<li><p>考虑使用 <code>UIImageView</code> 类别的<a href="https://github.com/rs/SDWebImage" rel="noreferrer noopener nofollow">SDWebImage</a>或 <a href="https://github.com/AFNetworking/AFNetworking" rel="noreferrer noopener nofollow">AFNetworking</a> ,它会延迟加载和缓存图像。</p>
<p>问题中的这段代码在启动异步检索之前不会正确重置 ImageView 。如果在图像检索完成之前重用单元格,它将不会处理这种情况。它可能会不必要地重新检索几秒钟前下载的图像。等等。</p>
<p>优雅地异步检索图像有很多问题,这两个类的 <code>UIImageView</code> 类别会为您处理很多这些细节。</p></li>
</ol></p>
<p style="font-size: 20px;">关于ios - 滚动从远程服务器加载大量图像的 UICollectionView 时如何避免内存问题?,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/30374373/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/30374373/
</a>
</p>
页:
[1]