إزالة الوالدين في AS3: هل هذا يفرج عن الذاكرة التي يستخدمها جميع الأطفال؟
-
03-10-2019 - |
سؤال
أقوم بعمل مشروع فلاش كبير إلى حد ما ولذا فإنني قلق بشأن استخدام الذاكرة. في نهاية كل قسم من التطبيق ، أقوم بإزالة العنصر الأصل الشامل الذي يحمل المحتوى. على الرغم من أن هذا يزيل الوالد ، فهل هذا أيضًا تحرير الذاكرة لكل من الأطفال الموجودين في هذا ، أو هل ينبغي عليّ تشغيل تكرار لإزالة تلك قبل إزالة الوالد؟
سأقدم المزيد من التفسير في حالة أنا لا أعبر عن ما أريد:
addChild(movie1);
movie1.addChild(movie2);
movie1.addChild(movie3);
باستخدام هذا الرمز:
removeChild(movie1);
هل يزيل Movie2 و Movie3 من الذاكرة أم أنهما لا يزالون مخزنين ، فقط غير مرتبطين؟
المحلول
حسنًا ، لا تتم إزالة أي شيء من الذاكرة حتى الآن ، فهذا يعتمد حقًا على كيفية الرجوع إلى Movie1. لنفترض أنه في وقت لاحق من التطبيق الذي تريد إضافة Movie1 مرة أخرى ، يجب أن تجد أن Movie1 لا يزال هنا فحسب ، بل إنه يحتوي أيضًا على Movie2 & Movie3.
var movie1:MovieClip; whatever(); anotherMethod(); function whatever():void { movie1 = new MovieClip(); var movie2:MovieClip = new MovieClip(); var movie3:MovieClip = new MovieClip(); movie1.addChild(movie2); movie1.addChild(movie3); addChild(movie1); whateverElse(); } function whateverElse():void { //here, nothing is garbage collected, movie1 exists outside //the scope of this function removeChild(movie1); //now you can tryThis(); //but if you do this you're effectively killing movie2 & movie3 , since //they're not referenced anywhere else. removeChild(movie1); movie1 = null; //this is going to throw an error , movie1's gone! tryThis(); } function tryThis():void { //yes ,it's still here with all its content addChild(movie1); } function anotherMethod():void { var movieN:MovieClip = new MovieClip(); var movie2:MovieClip = new MovieClip(); var movie3:MovieClip = new MovieClip(); movieN.addChild(movie2); movieN.addChild(movie3); // do all you need to do... // then removeChild( movieN); getOut(); } function getOut():void { //life goes on without movieN, movie2 & movie3 //waiting to be garbage collected }
نصائح أخرى
إذا movie2
و movie3
لم يعد يشير إليه كائن آخر ، يجب جمع القمامة. الأمر نفسه ينطبق على movie1
.
من إنشاء مكونات مرنة مرئية في ActionScript :
لإزالة عنصر تحكم برمجي ، يمكنك استخدام أساليب removechild () أو removeChildat (). يمكنك أيضًا استخدام طريقة removeallchildren () لإزالة جميع أدوات التحكم في الأطفال من حاوية. استدعاء هذه الأساليب لا يحذف الكائنات في الواقع. إذا لم يكن لديك أي إشارات أخرى إلى الطفل ، فإن Flash Player يتضمنه في مجموعة القمامة في وقت ما. ولكن إذا قمت بتخزين إشارة إلى ذلك الطفل على بعض الأشياء ، فلا تتم إزالة الطفل من الذاكرة.
من طبعه يزيل كل 3.
فيلم الطفل 1 لديه طفلان ، Movie2 + 3. إذا مات بسبب بعض حالات الوفاة ، فإن الأطفال سيموتون أيضًا.
ربما أكون مخطئًا ولكن يمكنك أيضًا المحاولة:
trace(movie2);