سؤال

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

وهذا الرمز يعمل كبيرة:

var mc = new MovieClip();
var dic = new Dictionary(true);
dic[mc] = 12;
mc = null;
System.gc();
System.gc();
for (var obj in dic)
   trace(obj);    //this doesn't execute

ولكن عندما كنت فعلا استخدام مقطع فيلم، فإنه يتوقف عن العمل:

var mc = new MovieClip();
var dic = new Dictionary(true);
dic[mc] = 12;
addChild(mc);
removeChild(mc);
mc = null;
System.gc();
System.gc();
for (var obj in dic)
   trace(obj);    //this prints [object Movieclip]

لماذا يحدث هذا؟ هل هناك شيء أفعله خطأ؟ هل هناك حل بديل؟

وتحرير: وأنا أعلم أن لهذا المثال معينة يمكنني استخدام delete dic[mc]، ولكن بالطبع هذه هي حالة مبسطة. بشكل عام، لا أريد أن يكون يدويا لإزالة مقطع فيلم من القاموس، ولكن يجب أن يكون تلقائيا عندما لا مرجع له بعد الآن في بقية التطبيق.

وEdit2: حاولت اختبار ما قاله هارون، وجاء مع الاشياء مجرد غريب ... فقط بالتكرار القاموس (دون أن تفعل أي شيء) تغيير سلوك:

var mc = new MovieClip();
var dic = new Dictionary(true);
dic[mc] = 12;
addChild(mc);
removeChild(mc);
mc = null;

for (var objeto in dic) {}    // <-- try commenting out this line

addEventListener('enterFrame', f);  // I print the contents every frame, to see if
                                    // it gets removed after awhile

function f(evento)
{
    System.gc();
    System.gc();

    for (var objeto in dic)
        trace(objeto);
}

وهذا يبقي الطباعة [الكائن في مقطع فيلم] كل إطار، ما لم أعلق خارج السطر المشار إليه، حيث لا تتم طباعة أي شيء.

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

المحلول

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

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

ورمز أدناه المخرجات:

[object MovieClip]
here

إذا كنت استدعاء otherfoo مباشرة في نهاية somefoo ()، وتحصل على:

[object MovieClip]
here
[object MovieClip]

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" mouseDown="somefoo()">
<mx:Script>
    <![CDATA[
        import mx.core.UIComponent;
        private var dic:Dictionary = new Dictionary(true);
        private var ui:UIComponent = new UIComponent();
        private var mc:MovieClip = new MovieClip();

        private function somefoo():void {
            this.addChild(ui);

            dic[mc] = 12;
            ui.addChild(mc);
            ui.removeChild(mc);
            for (var obj:Object in dic)
               trace(obj);    //this prints [MovieClip]

            this.removeChild(ui);

                            // callLater causes the function to be called in the _next_ frame.
            callLater(otherfoo);
        }

        private function otherfoo():void
        {
            trace("here");
            mc = null;
            System.gc();
            System.gc();

            for (var obj:Object in dic)
               trace(obj);    //this prints [MovieClip]

        }
    ]]>
</mx:Script>
</mx:Application>

نصائح أخرى

في أنك كنت مثال التعليمة البرمجية هنا كنت أبدا إضافة مقطع فيلم إلى القاموس، ولكن كثافة العمليات 12 بدلا من ذلك؟ ربما خطأ مطبعي.

إذا كنت تريد القاموس لديها قائمة من ما هو حاليا على الساحة، لماذا لا يكون أنا كطبقة UTIL بدلا من ذلك أن يستمع إلى Event.ADDED_TO_STAGE وEvent.REMOVED_FROM_STAGE وتعديل القاموس وفقا لذلك؟ A القاموس لا تلقائيا حذف الإشارات إذا كانت تحصل على إزالتها من المرحلة. أيضا القيادة العامة في هذه الحالة يجب أن لا علاقة لها بهذا.

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