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?
Cuando llamo a deinit
en su clase CropViewController.swift
, no se llama.
¡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!
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 ...