Tocropviewcontroller: Possible fuite de mémoire ?

Créé le 8 mars 2018  ·  4Commentaires  ·  Source: TimOliver/TOCropViewController

J'utilise CropViewController pour Swift et je viens de l'installer hier, donc mon pod est à jour. J'aime vraiment ça, bon travail mec, mais je pense qu'une fuite de mémoire est possible.

Je viens de créer un nouveau UIViewController et de le présenter via modalement. J'ai UIImageView sur ce contrôleur et il a un reconnaisseur de robinet. J'utilise UIImagePickerController et présente l'objet CropViewController lorsque la sélection des médias se termine comme;

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)
        } 
    }

Après avoir fini de recadrer et de rejeter ce UIViewController, deinit n'a jamais appelé. Si je change la méthode déléguée imagePickerController comme ceci;

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        if let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
            self.imageView.image = selectedImage
        } 
    }

alors si je suis renvoyé, deinit appelle. Je ne définis aucun élément spécial, seulement UIViewController, UIImageView et UIImagePickerController ici. Est-ce que j'ai mal configuré quelque chose ou s'agit-il d'une fuite de mémoire ?

- ÉDITER -

Quand j'appelle deinit dans votre classe CropViewController.swift , il n'est pas non plus appelé.

bug

Commentaire le plus utile

d'accord .. je l'ai corrigé avec ce qui suit
1- J'ai rendu le délégué faible, car les délégués devraient toujours être faibles
2- J'ai fait les auto-appels à l'intérieur des gestionnaires pour être [moi faible]

Dans votre CropViewController.swift, consultez les rappels 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)
            }
        }
    }

Tous les 4 commentaires

Salut @kcankaynak !

Euh-oh. Vous avez raison. Cela sent certainement comme une fuite de mémoire. Je devrai l'essayer dans l'exemple d'application quand j'en aurai l'occasion. Merci de me le faire savoir!

J'ai le même problème, il y a un cycle de rétention qui fait que mon UIViewController (celui qui présente votre crop VC) n'est pas libéré, il n'appelle pas la méthode deinit comme

public var delegate: CropViewControllerDelegate? {
        didSet { self.setUpDelegateHandlers() }
    }

alors j'ai pensé... peut-être

délégué var public faible : CropViewControllerDelegate ? {
didSet { self.setUpDelegateHandlers() }
}

va le réparer... mais ça n'a pas marché :(

d'accord .. je l'ai corrigé avec ce qui suit
1- J'ai rendu le délégué faible, car les délégués devraient toujours être faibles
2- J'ai fait les auto-appels à l'intérieur des gestionnaires pour être [moi faible]

Dans votre CropViewController.swift, consultez les rappels 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)
            }
        }
    }

Cela a été fusionné dans un autre PR. Merci pour ça!

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

TimOliver picture TimOliver  ·  12Commentaires

erickva picture erickva  ·  4Commentaires

Snow-Tech picture Snow-Tech  ·  4Commentaires

agusguerra10 picture agusguerra10  ·  5Commentaires

muranobu picture muranobu  ·  4Commentaires