我正在快速使用 CropViewController 并且昨天刚刚安装,所以我的 pod 是最新的。 我真的很喜欢它,干得好,但我认为可能发生内存泄漏。
我只是创建新的 UIViewController 并通过模态呈现它。 我在这个控制器上有 UIImageView 并且它有点击识别器。 我使用 UIImagePickerController 并在媒体拾取完成时呈现 CropViewController 对象;
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
let cropVC = CropViewController(croppingStyle: .circular, image: selectedImage)
cropVC.delegate = self
picker.present(cropVC, animated: false, completion: nil)
}
}
完成裁剪并关闭此 UIViewController 后, deinit
从未调用过。 如果我像这样更改imagePickerController
委托方法;
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
self.imageView.image = selectedImage
}
}
那么如果我被解雇, deinit
打电话。 我没有设置任何特殊项目,这里只有 UIViewController、UIImageView 和 UIImagePickerController。 我是否设置错误或这是内存泄漏?
当我在你的CropViewController.swift
类中调用deinit
时,它都没有被调用。
嗨@kcankaynak!
哦哦。 你是对的。 这当然闻起来像内存泄漏。 有机会时,我将不得不在示例应用程序中尝试一下。 谢谢你让我知道!
我有同样的问题,有一个保留周期导致我的 UIViewController(呈现你的作物 VC 的那个)没有被释放,它没有像@kcankaynak提到的那样调用 deinit 方法。 我认为这是您的croppingVC 委托不弱,因为您的委托财产为
public var delegate: CropViewControllerDelegate? {
didSet { self.setUpDelegateHandlers() }
}
所以我想..也许
公共弱变量委托:CropViewControllerDelegate? {
didSet { self.setUpDelegateHandlers() }
}
会解决它......但它没有:(
好吧..我用以下方法修复了它
1- 我让代表变弱了,因为代表应该总是弱的
2-我在处理程序中进行了自我调用 [weak self]
在您的 CropViewController.swift 中查看 onDid... 回调。
fileprivate func setUpDelegateHandlers() {
guard let delegate = self.delegate else {
onDidCropToRect = nil
onDidCropImageToRect = nil
onDidCropToCircleImage = nil
onDidFinishCancelled = nil
return
}
if delegate.responds(to: #selector(CropViewControllerDelegate.cropViewController(_:didCropImageToRect:angle:))) {
self.onDidCropImageToRect = {[weak self] rect, angle in
delegate.cropViewController!((self)!, didCropImageToRect: rect, angle: angle)
}
}
if delegate.responds(to: #selector(CropViewControllerDelegate.cropViewController(_:didCropToImage:withRect:angle:))) {
self.onDidCropToRect = {[weak self] image, rect, angle in
delegate.cropViewController!((self)!, didCropToImage: image, withRect: rect, angle: angle)
}
}
if delegate.responds(to: #selector(CropViewControllerDelegate.cropViewController(_:didCropToCircularImage:withRect:angle:))) {
self.onDidCropToCircleImage = {[weak self] image, rect, angle in
delegate.cropViewController!((self)!, didCropToCircularImage: image, withRect: rect, angle: angle)
}
}
if delegate.responds(to: #selector(CropViewControllerDelegate.cropViewController(_:didFinishCancelled:))) {
self.onDidFinishCancelled = { [weak self] finished in
delegate.cropViewController!((self)!, didFinishCancelled: finished)
}
}
}
这被合并到另一个 PR 中。 感谢那!
最有用的评论
好吧..我用以下方法修复了它
1- 我让代表变弱了,因为代表应该总是弱的
2-我在处理程序中进行了自我调用 [weak self]
在您的 CropViewController.swift 中查看 onDid... 回调。