Saya menggunakan CropViewController untuk Swift dan baru saja menginstal kemarin sehingga pod saya mutakhir. Saya sangat menyukainya, pekerjaan yang bagus, tetapi saya pikir ada kemungkinan terjadi kebocoran memori.
Saya baru saja membuat UIViewController baru dan menyajikannya melalui modally. Saya memiliki UIImageView pada pengontrol ini dan memiliki pengenal ketuk. Saya menggunakan UIImagePickerController dan menyajikan objek CropViewController saat pengambilan media selesai seperti;
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)
}
}
Setelah selesai memotong dan menutup UIViewController ini, deinit
tidak pernah menelepon. Jika saya mengubah metode delegasi imagePickerController
seperti ini;
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
self.imageView.image = selectedImage
}
}
lalu jika saya diberhentikan, deinit
menelepon. Saya tidak mengatur item khusus, hanya UIViewController, UIImageView dan UIImagePickerController di sini. Apakah saya mengatur sesuatu yang salah atau apakah ini kebocoran memori?
Ketika saya memanggil deinit
di kelas CropViewController.swift
, juga tidak dipanggil.
Hai @kcankaynak!
Uh oh. Kamu benar. Itu pasti baunya seperti kebocoran memori. Saya harus mencobanya di aplikasi sampel ketika saya mendapat kesempatan. Terima kasih telah memberi tahu saya!
Saya memiliki masalah yang sama, ada siklus penyimpanan yang menyebabkan UIViewController saya (yang menyajikan VC tanaman Anda) tidak dirilis, itu tidak memanggil metode deinit seperti yang disebutkan
public var delegate: CropViewControllerDelegate? {
didSet { self.setUpDelegateHandlers() }
}
jadi saya pikir.. mungkin
delegasi var lemah publik: CropViewControllerDelegate? {
didSet { self.setUpDelegateHandlers() }
}
akan memperbaikinya ... tapi tidak :(
oke .. saya perbaiki dengan yang berikut
1- Saya membuat delegasi lemah, karena delegasi harus selalu lemah
2- Saya membuat panggilan diri di dalam penangan menjadi [diri lemah]
Di CropViewController.swift Anda, lihat panggilan balik 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)
}
}
}
Ini digabungkan dalam PR lain. Terima kasih untuk itu!
Komentar yang paling membantu
oke .. saya perbaiki dengan yang berikut
1- Saya membuat delegasi lemah, karena delegasi harus selalu lemah
2- Saya membuat panggilan diri di dalam penangan menjadi [diri lemah]
Di CropViewController.swift Anda, lihat panggilan balik onDid....