Tocropviewcontroller: Kemungkinan kebocoran memori?

Dibuat pada 8 Mar 2018  ·  4Komentar  ·  Sumber: TimOliver/TOCropViewController

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?

- EDIT -

Ketika saya memanggil deinit di kelas CropViewController.swift , juga tidak dipanggil.

bug

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....

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)
            }
        }
    }

Semua 4 komentar

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!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat