【发布时间】:2019-08-25 22:21:54
【问题描述】:
当我在 collectionView-didSelectItemAt/UIAlertController 中对 UIImage 数组执行 remove(at: [index]) 时,我最终会出现内存泄漏。 (注意:数组实际上是我定义的一个类的一部分。)
这个问题很难找到,因为它在删除时似乎有效。更具体地说,在我从数组中删除图像并打印内容后,它就消失了,内存看起来还不错。但后来,当我处理完那个对象后,对象的 deinit 方法就再也不会被调用了。
注意:我也尝试在主队列上执行代码。
class ExampleObj {
var vehicleImages: [UIImage]
init() {
self.vehicleImages = []
}
deinit() {
print("Object deinitialized")
}
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let alert = UIAlertController(title: "Delete Image", message: "", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Delete Image", style: .destructive, handler: { (action) in
alert.dismiss(animated: true, completion: nil)
// Delete image
self.exampleObj.vehicleImages.remove(at: indexPath.row)
}))
alert.addAction(UIAlertAction(title: "Return", style: .default, handler: { (action) in
alert.dismiss(animated: true, completion: nil)
}))
self.present(alert, animated: true, completion: nil)
}
【问题讨论】:
-
如果您使用
handler: { [weak self] (action) in //code }是否可以解决您的内存泄漏问题? -
我不相信它会;我删除了操作中的所有代码并尝试运行,一切正常。 @DanO'Leary
-
我认为没有必要添加 deinit,我的错误。而且我不确定如何解释泄漏的性质......当我完成该对象时,对象 deinit 方法永远不会被调用,因此该对象不会被释放 - 泄漏。奇怪的是,如果我将 (self.exampleObj.vehicleImages.remove(at: indexPath.row)) 移动到警报控制器块之外(并保持其他所有内容相同),我看不到泄漏@Rob
-
在您的示例代码中,不应调用
ExampleObj.deinit。您不会删除ExampleObj。您正在删除包含在ExampleObj中的图像。您认为这里应该发生什么行为,确实发生了什么行为(以及您如何确定这种行为发生)? -
@RobNapier 请仔细阅读帖子:“在我从数组中删除图像并打印内容后,它消失了,内存看起来很好。~但是后来,当我完成那个对象,~对象的deinit方法永远不会被调用。”所以我的意思是当我说“稍后,当我完成那个对象”时,我的意思是我已经在创建对象的 VC 中完成了我需要的一切,然后我返回(关闭所说的 VC)对象(和VC) 应该被释放,但它们不是。
标签: swift memory-leaks uialertcontroller