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 ?
Quand j'appelle deinit
dans votre classe CropViewController.swift
, il n'est pas non plus appelé.
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!
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....