[英]Closure Capture Memory Leak issue with UITableView
在willDisplay
方法中,我从回调闭包中获取UIImage
和IndexPath
。 我在那个闭包中使用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.