我有一个程序,它有两个选项卡,每个选项卡都有自己的视图控制器。第二个选项卡是一个基本屏幕,其中显示了一个按钮,而第一个选项卡是一个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!)
}
}
}
编辑:如果我删除保存个人资料图片的行,内存泄漏就会消失,这进一步证明了内存泄漏似乎存在于我下载图片的方式中。
提前谢谢你!
发布于 2020-09-17 03:39:27
阿!我想通了。实际上,这与我如何下载图片一点关系都没有。
我的问题是,我是通过在Cloud Firestore
中的collection
上调用.addSnapshotListener
来检索单元的。但是,我从来没有删除过侦听器,这意味着我的UICollectionView
永远不会被反初始化,这导致了巨大的内存泄漏。
通过在第一个控制器的viewWillDisapper
中调用mySnapshotListener.remove()
,我能够消除内存泄漏。
https://stackoverflow.com/questions/63930761
复制