Tocropviewcontroller: احتمال تسرب الذاكرة؟

تم إنشاؤها على ٨ مارس ٢٠١٨  ·  4تعليقات  ·  مصدر: TimOliver/TOCropViewController

أنا أستخدم CropViewController من أجل swift وقد قمت بتثبيته بالأمس حتى يتم تحديث الكبسولة الخاصة بي. أنا حقا أحب ذلك ، عمل جيد يا رجل ولكن أعتقد أن هناك احتمال حدوث تسرب للذاكرة.

لقد قمت فقط بإنشاء وحدة تحكم UIViewController جديدة وأقدمها بشكل نمطي. لدي UIImageView على وحدة التحكم هذه ولديها أداة التعرف على النقر. أستخدم UIImagePickerController وأقدم كائن CropViewController عند انتهاء اختيار الوسائط مثل ؛

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

بعد الانتهاء من الاقتصاص ورفض UIViewController هذا ، لم يتم الاتصال بـ deinit . إذا كنت أقوم بتغيير imagePickerController أسلوب التفويض مثل هذا ؛

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        if let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
            self.imageView.image = selectedImage
        } 
    }

ثم إذا رفضت ، مكالمات deinit . لم أقم بتعيين أي عناصر خاصة ، فقط UIViewController و UIImageView و UIImagePickerController هنا. هل أقوم بإعداد أي شيء خاطئ أم أن هذا تسرب للذاكرة؟

- تعديل -

عندما أتصل بـ deinit في صفك CropViewController.swift ، لم يتم استدعائه.

bug

التعليق الأكثر فائدة

حسنًا .. أصلحته بما يلي
1- جعلت المندوب ضعيفاً ، لأن المندوب يجب أن يكون ضعيفاً دائماً
2- قمت بإجراء النداءات الذاتية داخل المتعاملين لتكون [النفس الضعيفة]

في CropViewController.swift الخاص بك ، راجع عمليات الاسترجاعات 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)
            }
        }
    }

ال 4 كومينتر

مرحباkcankaynak!

عذرًا. أنت على حق. هذا بالتأكيد يشبه رائحة تسرب الذاكرة. سأضطر إلى تجربته في نموذج التطبيق عندما تسنح لي الفرصة. شكرا على إعلامي!

لدي نفس المشكلة ، هناك دورة احتفاظ تتسبب في عدم تحرير UIViewController الخاص بي (الذي يقدم VC المحصول الخاص بك) ، ولا يطلق على طريقة deinit كما ذكر

public var delegate: CropViewControllerDelegate? {
        didSet { self.setUpDelegateHandlers() }
    }

لذلك اعتقدت .. ربما

مندوب فار العام الضعيف : CropViewControllerDelegate؟ {
didSet {self.setUpDelegateHandlers ()}
}

سوف يصلحها ... لكنها لم :(

حسنًا .. أصلحته بما يلي
1- جعلت المندوب ضعيفاً ، لأن المندوب يجب أن يكون ضعيفاً دائماً
2- قمت بإجراء النداءات الذاتية داخل المتعاملين لتكون [النفس الضعيفة]

في CropViewController.swift الخاص بك ، راجع عمليات الاسترجاعات 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)
            }
        }
    }

تم دمج هذا في علاقات عامة أخرى. شكرا على ذلك!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات