使用SDWebImage加载GIF占用的内存远远超出预期

时间:2019-07-15 19:38:18

标签: swift memory memory-leaks sdwebimage

我正在构建一个UITableView,其中填充了使用SDWebImage下载的图像和GIF。图像显示在表格单元格中,而GIF显示为3D触摸预览。

问题在于,每次预览GIF时,内存峰值(如预期的那样),但是内存使用量的增加远远超过了我的预期。手动下载其中一个GIF时,我发现它只有500kB左右,但是通过SDWebImage在应用程序中进行操作时,内存增加接近100MB。

仅几次GIF预览后,由于内存问题应用程序崩溃了...

起初,我以为退出GIF预览时GIFView的实例可能没有被释放-我检查了'''deinit'''并且它似乎正在取消分配。

我还在viewDidDisappear中将GIFView重置为“''nil''”,但这也没有帮助。

查看分配工具,我发现GIF在首次加载时就永久存储在内存中。这解释了为什么再次查看相同的GIF不会增加内存。

有人知道为什么这些GIF占用这么多内存吗?我还构建了该应用程序的一个版本,其中所有资产都位于本地,并且运行平稳,没有打h或内存问题-但是,在两种情况下,GIF大小肯定都应该相同吗?

如果没有泄漏并且不可避免地出现了这些内存尖峰,还有其他方法可以在GIF消失时从内存中清除GIF吗?

代码在下面

//model
struct Visualisation: Codable {
    var id: Int
    let name, info, url_name, tags, imageURL, gifURL: String
}

//3D touch GIF preview
extension ViewController: UIViewControllerPreviewingDelegate {

    func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {

        guard let indexPath = tableView.indexPathForRow(at: location) else { return nil }
        let selectedVis = filteredVisualisations[indexPath.row]

        let identifier = "GIFViewController"
        guard let GIFVC = storyboard?.instantiateViewController(withIdentifier: identifier) as? GIFViewController else { return nil}

        GIFVC.selection = selectedVis

        GIFVC.preferredContentSize = CGSize(width: 0, height: 190)

        return GIFVC
    }

//GIFViewController

import UIKit
import SDWebImage

class GIFViewController: UIViewController {

    @IBOutlet weak var GIFView: UIImageView!

    var selection = visualisations[0]

    override func viewDidLoad() {
        super.viewDidLoad()

        GIFView.sd_setImage(with: URL(string: selection.gifURL))

        // Do any additional setup after loading the view.
    }

    override func viewDidDisappear(_ animated: Bool = true) {
    }

    deinit {
        print("DEALLOCATED GIFViewController class")
    }

}


//setting the table cells
class TableViewCell: UITableViewCell {

    @IBOutlet weak var ImageView: UIImageView!
    @IBOutlet weak var TitleLabel: UILabel!
    @IBOutlet weak var InfoLabel: UILabel!

    func setCell(visualisation: Visualisation){

        ImageView.sd_setImage(with: URL(string: visualisation.imageURL))
        TitleLabel.text = visualisation.name
        InfoLabel.text = visualisation.info
    }
}

任何帮助将不胜感激。

P.S。我相信您已经注意到我对iOS开发非常陌生...请原谅我的“新手” ...

0 个答案:

没有答案