أنا أستخدم 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
، لم يتم استدعائه.
مرحبا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)
}
}
}
تم دمج هذا في علاقات عامة أخرى. شكرا على ذلك!
التعليق الأكثر فائدة
حسنًا .. أصلحته بما يلي
1- جعلت المندوب ضعيفاً ، لأن المندوب يجب أن يكون ضعيفاً دائماً
2- قمت بإجراء النداءات الذاتية داخل المتعاملين لتكون [النفس الضعيفة]
في CropViewController.swift الخاص بك ، راجع عمليات الاسترجاعات onDid ....