Tocropviewcontroller: ¿Posible fuga de memoria?

Creado en 8 mar. 2018  ·  4Comentarios  ·  Fuente: TimOliver/TOCropViewController

Estoy usando CropViewController para swift y acabo de instalarlo ayer, por lo que mi pod está actualizado. Realmente me gusta, buen trabajo, hombre, pero creo que es posible que haya ocurrido una pérdida de memoria.

Simplemente creo un nuevo UIViewController y lo presento de forma modal. Tengo UIImageView en este controlador y tiene un reconocedor de tap. Utilizo UIImagePickerController y presento el objeto CropViewController cuando la selección de medios termina como;

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

Después de terminar de recortar y descartar este UIViewController, deinit nunca se llamó. Si estoy cambiando el método imagePickerController delegate de esta manera;

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

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

entonces, si me despido, deinit llama. No configuro ningún elemento especial, solo UIViewController, UIImageView y UIImagePickerController aquí. ¿Configuré algo incorrecto o se trata de una pérdida de memoria?

- EDITAR -

Cuando llamo a deinit en su clase CropViewController.swift , no se llama.

bug

Comentario más útil

bien ... lo arreglé con lo siguiente
1- Hice al delegado débil, porque los delegados siempre deben ser débiles
2- Hice las auto-llamadas dentro de los manejadores para ser [yo débil]

En su CropViewController.swift, vea las devoluciones de llamada 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)
            }
        }
    }

Todos 4 comentarios

¡Hola @kcankaynak!

UH oh. Estás bien. Eso ciertamente huele a pérdida de memoria. Tendré que probarlo en la aplicación de muestra cuando tenga la oportunidad. ¡Gracias por hacérmelo saber!

Tengo el mismo problema, hay un ciclo de retención que hace que mi UIViewController (el que presenta su VC de cultivo) no se libere, no llama al método deinit como mencionó

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

así que pensé ... tal vez

delegado var débil público: CropViewControllerDelegate? {
didSet {self.setUpDelegateHandlers ()}
}

lo arreglará ... pero no lo hizo :(

bien ... lo arreglé con lo siguiente
1- Hice al delegado débil, porque los delegados siempre deben ser débiles
2- Hice las auto-llamadas dentro de los manejadores para ser [yo débil]

En su CropViewController.swift, vea las devoluciones de llamada 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)
            }
        }
    }

Este se fusionó en otro PR. ¡Gracias por eso!

¿Fue útil esta página
0 / 5 - 0 calificaciones