首页 > 解决方案 > UITableView 的关闭捕获内存泄漏问题

问题描述

willDisplay方法中,我从回调闭包中获取UIImage和。IndexPathtableView在那个封闭内使用。我是否需要制作该 tableViewweak以避免可能的内存泄漏,或者使用它不是问题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)
        }
    }
}

标签: iosswiftclosures

解决方案


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

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

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

随意用 Instruments 来证明它。


推荐阅读