Tocropviewcontroller: Possível vazamento de memória?

Criado em 8 mar. 2018  ·  4Comentários  ·  Fonte: TimOliver/TOCropViewController

Estou usando o CropViewController para swift e acabei de instalar ontem, então meu pod está atualizado. Eu realmente gosto disso, bom trabalho cara, mas eu acho que é possível que tenha ocorrido um vazamento de memória.

Acabei de criar um novo UIViewController e apresentá-lo via modal. Eu tenho UIImageView neste controlador e tem um reconhecedor de torneira. Eu uso UIImagePickerController e apresento o objeto CropViewController quando a seleção de mídia 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)
        } 
    }

Depois de terminar de cortar e descartar este UIViewController, deinit nunca chamou. Se eu estiver mudando o método imagePickerController delegate assim;

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

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

então, se eu for dispensado, deinit liga. Eu não defino nenhum item especial, apenas UIViewController, UIImageView e UIImagePickerController aqui. Eu configurei algo errado ou isso é um vazamento de memória?

- EDITAR -

Quando eu chamo deinit em sua classe CropViewController.swift , também não é chamado.

bug

Comentários muito úteis

ok .. Eu consertei com o seguinte
1- Fiz o delegado fraco, porque delegado deve ser sempre fraco
2- Eu fiz as chamadas self dentro dos manipuladores para ser [self fraco]

Em seu CropViewController.swift veja os retornos de chamada 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 comentários

Olá, @kcankaynak!

Opa. Você tem razão. Isso certamente cheira a vazamento de memória. Terei que testá-lo no aplicativo de amostra quando tiver oportunidade. Obrigado por me avisar!

Eu tenho o mesmo problema, há um ciclo de retenção fazendo com que meu UIViewController (aquele que apresenta seu VC de colheita) não seja liberado, ele não chama o método deinit como

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

então eu pensei .. talvez

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

vai consertar ... mas não :(

ok .. Eu consertei com o seguinte
1- Fiz o delegado fraco, porque delegado deve ser sempre fraco
2- Eu fiz as chamadas self dentro dos manipuladores para ser [self fraco]

Em seu CropViewController.swift veja os retornos de chamada 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 foi fundido em outro PR. Obrigado por isso!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

ntnmrndn picture ntnmrndn  ·  4Comentários

agusguerra10 picture agusguerra10  ·  5Comentários

TimOliver picture TimOliver  ·  4Comentários

asadqazi picture asadqazi  ·  3Comentários

TimOliver picture TimOliver  ·  12Comentários