繁体   English   中英

使用 UITableView 关闭捕获内存泄漏问题

[英]Closure Capture Memory Leak issue with UITableView

willDisplay方法中,我从回调闭包中获取UIImageIndexPath 我在那个闭包中使用tableView 我应该让 tableView 变weak以避免可能的内存泄漏,还是使用strong tableView不是问题?

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    guard let cell = cell as? ArtistTableViewCell else { return }
    guard let imageUrl = cell.viewModel.artistImage() else { return }

    // Download image callback closure returns UIImage, IndexPath, and error
    ImageDownloadService.shared.downloadImage(imageUrl,indexPath:indexPath) { [weak tableView] (image, index, error) in
        DispatchQueue.main.async {
            guard let getIndexPath = index else { return }
            guard let getImage = image else { return }
            guard let getCell = tableView?.cellForRow(at: getIndexPath) as? ArtistTableViewCell else { return }

            getCell.setArtistImage(getImage)
        }
    }
}

没有必要显式捕获tableView因为它在willDisplay方法的第一个参数中作为局部变量提供。

因此它不会导致内存泄漏。

有一个简单的规则:不要捕获方法内部可本地访问的任何内容。

随意用 Instruments 来证明它。

语言环境变量不会被闭包捕获,因为它们在同一范围内,因此您无需将 tableview 设为弱引用。

weak优先。 如果在下载图像时保留tableView并关闭视图控制器,则在调用下载完成之前,不会释放表视图对象(及其单元格)。 (但是不会发生保留循环)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM