我正在构建一个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开发非常陌生...请原谅我的“新手” ...