Tocropviewcontroller: 可能内存泄漏?

创建于 2018-03-08  ·  4评论  ·  资料来源: TimOliver/TOCropViewController

我正在快速使用 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时,它都没有被调用。

最有用的评论

好吧..我用以下方法修复了它
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)
            }
        }
    }

所有4条评论

嗨@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 中。 感谢那!

此页面是否有帮助?
0 / 5 - 0 等级