الخلط حول جمع القمامة والأحداث مع مراجع ضعيفة في ActionScript 3
-
16-09-2019 - |
سؤال
لدي إشارة إلى كائن. هذا الكائن لديه حدث مؤقت مع مرجع ضعيف. مثال:
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');
};
}
}
}
بشكل عام، يجب أن لا تعتمد على جامع القمامة للتشغيل الصحيح للبرنامج الخاص بك.