سؤال

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

والوضع أتعامل مع ينطوي 2 مثيلات الفئة UIViewController. في البدء، يتم إنشاء المرحلة الأولى ويضاف رأيها إلى آخر الطبقة UIViewController "الرئيسية" التي هي جزء من MainWindow.xib. في هذا المثال الأول هو "المعلومات" الزر الذي عندما استغلالها، بالتبديل إلى مثيل جديد من فئة UIViewController (إذا لم يكن قد تم إنشاؤه). وUIViewController "الرئيسي" يدير هذا التحول مع الوجه الرسوم المتحركة المعتاد. يمكن رؤية الإعداد الأساسي في "بداية iPhone التنمية: استكشاف اي فون SDK". كتاب من قبل ديف الأقسام

والمشكلة الذي يطرح نفسه هو أنه بمجرد أن يتم استغلالها على زر "المعلومات" للمرة الأولى، يتم تخصيص الذاكرة إلى مثيل UIViewController الثاني الجديد وعدم إصدارها حتى ينتهي التطبيق. ويرجع ذلك إلى عدد من العناصر على وجهة النظر هذه المعلومات، ويستخدم ما يقرب من 1MB من الذاكرة مرة واحدة مثيل وأضاف رأيها إلى superview. أية محاولات لتدمير باستمرار وبتكرار هذه النتائج المثال في حدوث تسرب للذاكرة، على غرار واحد موجود إذا كنت تحاول أن تفعل الشيء نفسه لمثيلات الفئة UIImagePickerController. وأظن أن السبب الجذري هو نفسه بين الطبقتين.

وجوهر مشكلتي ينطوي على يحتاجون لقدر الذاكرة حررت قبل أن تسمح للمستخدم التقاط صورة مع الكاميرا. ومع ذلك، مرة واحدة اتخذت المستخدم صورة ويرون الصورة الناتجة أول مرة من خلال السماح لهم للاستفادة على زر "المعلومات" التي توجد على سبيل المثال UIViewController الأول. مرة واحدة استغلالها، وUIViewController "الرئيسي" يزيل عرض موجودة UIViewController ويستبدلها مع واحد للشاشة المعلومات. شاشة معلومات يحتوي على زر "الخلفي" للتبديل وجهات النظر إلى الوراء. ومع ذلك، مرة واحدة يترك للمستخدم شاشة معلومات ويختار لالتقاط صورة أخرى مع الكاميرا، الذاكرة المخصصة إلى شاشة المعلومات لا تزال في الذاكرة.

والطبقة UIImagePickerController يستخدم مؤقتا تقريبا 15-18MB بينما يقوم بمعالجة الصورة 2 ميجا بكسل قبل الإفراج عن مراجع الداخلية و"imagePickerController: didFinishPickingImage" ويسمى مندوب. أنا على التوالي في التنبيهات الذاكرة منخفضة متى تم إنشاء مثيل UIViewController الثاني عن طريق زر معلومات ثم يختار المستخدم لالتقاط صورة أخرى.

والذاكرة من الناحية الفنية لا يتسرب ما إذا كنت التقاط صور أكثر وأكثر مع أو بدون النقر على زر معلومات في حالتي، ولكن نظرا لقضايا أخرى تتعلق العمليات الخلفية على iPhone (سفاري، الخ) التي هي خارجة عن إرادتك، يجب أن تحرير الذاكرة قدر الإمكان أثناء العمل مع أشياء مثل الكاميرا.

وأي نصيحة حول كيفية إنشاء نظيفة وتدمير مثيلات الفئة UIViewController مثل تلك الذاكرة لا تسرب؟

هل كانت مفيدة؟

المحلول

هل تحميل تحكم رأي ثاني من طرف مستدق؟ إذا كان الأمر كذلك، فأنت تريد أن تحقق أنك تحرير الذاكرة المرتبطة بشكل صحيح.

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

SomeViewController.h

@interface SomeViewController : UIViewController {
    UILabel *someLabel;
}

@property (nonatomic, retain) IBOutlet UILabel *someLabel;

@end

SomeViewController.m

@implementation SomeViewController

@synthesize someLabel;

- (void)dealloc {
    // Release our retained IBOutlets
    self.someLabel = nil;
    [super dealloc];
}

@end

نصائح أخرى

وطريقة واحدة لتقليل استخدام الذاكرة الخاصة بك سيكون لتغيير حجم الصورة لحجم ما تريد (ما لم يكن بالطبع كنت تريد صورة 320x480 وضع). التي ساعدت كثيرا في حالتي.

هل viewcontroller الثاني الذي يتحدثون عن التغيير؟ إذا لم يكن كذلك، فإنه سيكون من الأفضل أن تجعل من المفرد واستخدام نفس المثال. يمكنك في أي وقت تغيير القيم المستخدمة من قبل viewcontroller. هذه المقالة يوضح كيف يمكنك إنشاء كائنات المفرد ( برمز)

آخر المقال هنا معارض استخدام فئة مفردة (على الرغم من مختلف حالة استخدامك، فإنه سيتم توضيح كيفية استخدام سنغلتونس)

وأود أن أقترح إنشاء كائن مفرد لUIImagePickerController جدا.

هل لديك أي دورات في سلسلة للملكية؟ شيء من هذا القبيل:

@interface FirstViewController: UIViewController {
  SecondViewController *secondViewController;
}
@end

@interface SecondViewController: UIViewController {
  FirstViewController *firstViewController;
}
@end

إذا كنت لا كسر صراحة هذه الدورة عند تجاهل هذه التحكم الرأي، وأنها سوف تسرب.

وأيضا، وأعتقد أنك كنت مسؤولا عن إطلاق سراح جميع الأشياء مستوى أعلى التي يتم تحميلها من ملف بنك الاستثمار القومي عندما لم تعد في حاجة إليها.

وربما يمكنك حفظ الصورة من قبل الانتقال إلى عرض المعلومات. بعد حفظ، والإفراج عن الصورة ثم الانتقال إلى عرض المعلومات. إذا يعود المستخدم، تحميل صورة من مجلد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top