Ios UITableViewCell中的内存增长

Ios UITableViewCell中的内存增长,ios,uitableview,custom-cell,Ios,Uitableview,Custom Cell,自定义单元格的我的代码: -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ImageView"]; NSURL *nsurl = [NSURL URLWithString:_image

自定义单元格的我的代码:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ImageView"];
    NSURL *nsurl = [NSURL URLWithString:_imageUrls[indexPath.row]];
    NSData *data = [NSData dataWithContentsOfURL: nsurl];

    cell.imageView.image = [UIImage imageWithData:data];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"ImageView"];
    }

    return cell;
我有自定义的VKTableViewCell类:

   @interface VKTableViewCell : UITableViewCell
    @property (weak, nonatomic) IBOutlet UIImageView *image;

    @end
图像约为800x800(从站点解析)。
当我滚动表格时,内存正在增长(从20兆增加到30兆,加载100幅图像)。为什么会这样?在这种情况下我必须做什么?我正在使用ARC。

您正在主线程上进行网络调用,这就是为什么它同时做两件事的原因

  • 渲染UITableView单元格

  • 为图像制作网络呼叫

  • 现在,您必须将网络调用逻辑从
    主线程转移到后台线程

    您还可以使用第三方Api或

    新解决方案:

    延迟加载UITableViewCell中的所有图像,只需创建一个UIImageView扩展,如下所示

    extension UIImageView {
        func downloadImageFrom(_ link:String, contentMode: UIView.ContentMode) {
    
            guard let url = URL(string: link) else {
               return
            }
            URLSession.shared.dataTask(with: url) { [weak self] (data, response, error) in
                guard let `self` = self else { return }
                DispatchQueue.main.async {
                    self.contentMode = contentMode
                    self.image = UIImage(data: data ?? Data())
                }
            }.resume()
        }
    }
    
    函数调用:

    cell.imageView.image = UIImage(named: "placeholder")  //set placeholder image first.
    cell.imageView.downloadImageFrom(link: dataSource[indexPath.row], contentMode: UIViewContentMode.ScaleAspectFit)  //set your image from link array.
    

    虽然与此问题无关,但您可能应该在创建新单元格的调用之后再调用设置映像。(在dequeReusableCellWithIdentifier返回nil的情况下。你所做的一切都是错误的。你不能在
    cellForRow
    中同步使用网络。你必须立即返回该单元格。用户正在滚动。现在返回一个单元格。@matt我知道服务质量和线程的一些事情。这不是最新版本的代码。但假设它是主线程,内存泄漏是否正常?每次我们看到同一个单元格时,你都在下载图像(例如,上下滚动)。这太疯狂了。将图像存储在数据模型中。你所做的一切都是错误的。(我想我是这么说的。)@matt谢谢,我会的。我使用了你的方法。但是如何在不重新加载单元格的情况下刷新?当它被加载时,它是空的。一旦你将获得imageData,那么在下一步中,你必须将该数据分配给主线程上的cell.imageView。通过这样做,你不必重新加载单元格(callerQueue^{cell.imageView.image=[UIImage imageWithData:imageData];})。之后,图像仅在我单击单元格时出现。默认情况下,它为空,但图像已加载。然后,您有两个选项:1-在此行上放置一个断点,将数据分配给uiimageView,第二个选项是检查单元格的背景色并下载图像。我认为图像是从网络下载的,但没有分配它们时有问题吗
    extension UIImageView {
        func downloadImageFrom(_ link:String, contentMode: UIView.ContentMode) {
    
            guard let url = URL(string: link) else {
               return
            }
            URLSession.shared.dataTask(with: url) { [weak self] (data, response, error) in
                guard let `self` = self else { return }
                DispatchQueue.main.async {
                    self.contentMode = contentMode
                    self.image = UIImage(data: data ?? Data())
                }
            }.resume()
        }
    }
    
    cell.imageView.image = UIImage(named: "placeholder")  //set placeholder image first.
    cell.imageView.downloadImageFrom(link: dataSource[indexPath.row], contentMode: UIViewContentMode.ScaleAspectFit)  //set your image from link array.