问题描述
我有一个程序,其中有两个选项卡,每个选项卡都使用自己的视图控制器运行。第二个选项卡是显示按钮的基本屏幕,而第一个选项卡是UICollectionView
,它显示几个UICollectionViewCell
,其中有图像和标签。
从UICollectionView
标签切换到其他标签时,似乎内存泄漏很大。我确定两个视图控制器都正确地命中了deinit
,而我的UICollectionViewCell
也正在取消初始化,因此我认为问题在于我如何提取数据。似乎Firebase调用及其返回的图像从未被释放。
有人可以帮我弄清楚我在做什么吗?
UICollectionViewCell
的定义如下
class InteractionViewCell: UICollectionViewCell {
@IBOutlet weak var Photo: UIImageView!
var Id:String?
@IBOutlet weak var personLabel: UILabel!
func configure(_ person:Person) {
self.Id = person:Person.id
FirebaseInstance.GetPersonProfilePicture(person.id) { image in
self.Photo.image = image
}
}
}
GetPersonProfilePicture
是:
class FirebaseInstance {
static private let StorageInst:StorageReference = Storage.storage().reference()
static var StorageRef:StorageReference = StorageInst
static private let ImageMaxSize = Int64(1 * 1024 * 1024)
static func GetPersonProfilePicture(_ userUID:String,completion: @escaping (UIImage) -> Void) {
StorageRef.child("\(userUID)").getData(maxSize: ImageMaxSize) { data,error in
if let error = error {
print(error.localizedDescription)
return
} else {
let downloadedImage = UIImage(data: data!)
completion(downloadedImage!)
}
}
}
编辑:如果我删除保存个人资料图片的行,则内存泄漏消失了,这更证明了内存泄漏似乎与我下载图像有关。
提前谢谢!
解决方法
啊!我想到了。实际上,这与我下载图像的方式完全无关。
我的问题是我正在通过在.addSnapshotListener
中的collection
上调用Cloud Firestore
来检索单元格。但是,我从来没有删除过监听器,这意味着我的UICollectionView
从未被初始化过,这导致了巨大的内存泄漏。
通过在第一个控制器的mySnapshotListener.remove()
内部调用viewWillDisapper
,我可以摆脱内存泄漏。