إزالة الوالدين في AS3: هل هذا يفرج عن الذاكرة التي يستخدمها جميع الأطفال؟

StackOverflow https://stackoverflow.com/questions/3734228

سؤال

أقوم بعمل مشروع فلاش كبير إلى حد ما ولذا فإنني قلق بشأن استخدام الذاكرة. في نهاية كل قسم من التطبيق ، أقوم بإزالة العنصر الأصل الشامل الذي يحمل المحتوى. على الرغم من أن هذا يزيل الوالد ، فهل هذا أيضًا تحرير الذاكرة لكل من الأطفال الموجودين في هذا ، أو هل ينبغي عليّ تشغيل تكرار لإزالة تلك قبل إزالة الوالد؟

سأقدم المزيد من التفسير في حالة أنا لا أعبر عن ما أريد:

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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top