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?
Quando eu chamo deinit
em sua classe CropViewController.swift
, também não é chamado.
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!
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 ....