簡體   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