الخلط حول جمع القمامة والأحداث مع مراجع ضعيفة في ActionScript 3

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

سؤال

لدي إشارة إلى كائن. هذا الكائن لديه حدث مؤقت مع مرجع ضعيف. مثال:

timer.addEventListener(TimerEvent.TIMER, timerHandler, false, 0, true);

الآن أزل هذا المرجع (الاختبار هو المتغير الذي يحتوي على المرجع):

test = null;

ومع ذلك، يحتفظ Timerhandler بإطلاق النار. هل هذا مستحيل، بحيث يجب أن يكون لدي خطأ من الخطأ في التعليمات البرمجية الخاصة بي، دون أي احتمال آخر؟

أو هل هذا في الواقع ليس من المفترض أن يوقف وظيفة الموقت من التشغيل طوال الوقت؟

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

المحلول

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

عندما أقوم بتشغيل المثال أدناه، أرى timer تتبع إلى أجل غير مسمى، على الرغم من handler تم تعيين إلى null و EventDispatcher لديه مرجع ضعيف. ومع ذلك، إذا أجبر جامع القمامة على الركض من خلال uncomment System.gc() خط (باستخدام لاعب التصحيح)، لا يسمى المعالج أبدا.

package {
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.events.TimerEvent;
  import flash.system.System;
  import flash.utils.Timer;

  public class TimerTest extends Sprite {
    private var timer:Timer;
    public function TimerTest() {
      var handler:Function = createHandler();
      timer = new Timer(1000);
      timer.addEventListener(TimerEvent.TIMER, handler, false, 0, true);
      timer.start();
      handler = null;
      //System.gc();
    }

    private function createHandler():Function {
      return function(e:Event):void {
        trace('timer');
      };
    }
  }
}

بشكل عام، يجب أن لا تعتمد على جامع القمامة للتشغيل الصحيح للبرنامج الخاص بك.

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