|
|
|||||
GC не срабатывает
не удаляется экземпляр класса :~/
в чём причина? так работает: package { import flash.display.Sprite; import flash.events.Event; import flash.events.TimerEvent; import flash.utils.Timer; public class Test extends Sprite { function Test():void { var a:Sprite = new Sprite(); a.addEventListener(Event.ENTER_FRAME, efListner, false, 0, true); addChild(a);removeChild(a);a=null; function efListner(e:Event):void {trace('Please delete me...');} forceGCRun(); } private function forceGCRun():void{ var a:Sprite; var count:uint; var oldCount:uint; var timer:Timer; a = new Sprite(); a.addEventListener(Event.ENTER_FRAME, efListner, false, 0, true); addChild(a);removeChild(a);a=null; function efListner(e:Event):void {count++;} timer = new Timer(1000); timer.addEventListener("timer", timerHandler, false, 0, true); timer.start(); function timerHandler(e:TimerEvent):void { if(oldCount == count){ trace(':)', timer.currentCount); timer.stop(); timer=null; } oldCount = count; for (var n:uint=0; n<10000; n++){ a = new Sprite(); addChild(a);removeChild(a);a=null; } } } } } а так не работает: package{ import flash.display.Sprite; import flash.events.Event; import flash.events.TimerEvent; import flash.utils.Timer; public class Test extends Sprite{ function Test(){ var c:c1 = new c1(); addChild(c); removeChild(c); c=null; forceGCRun(); } public function forceGCRun():void{ var a:Sprite; var count:uint; var oldCount:uint; var timer:Timer; a = new Sprite(); a.addEventListener(Event.ENTER_FRAME, efListner, false, 0, true); addChild(a);removeChild(a);a=null; function efListner(e:Event):void {count++;} timer = new Timer(1000); timer.addEventListener("timer", timerHandler, false, 0, true); timer.start(); function timerHandler(e:TimerEvent):void { if(oldCount == count){ trace('GC RUN :)', timer.currentCount); timer.stop(); timer=null; } oldCount = count; for (var n:uint=0; n<10000; n++){ a = new Sprite(); addChild(a);removeChild(a);a=null; } } } } } import flash.display.Sprite; import flash.events.Event; class c1 extends Sprite{ function c1(){ addEventListener(Event.ENTER_FRAME, function(e:Event):void{trace('c');},false,0,true); } }
__________________
Хороший отдых - половина работы. |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
А вот так срабатывает:
class c1 extends Sprite{ function c1(){ addEventListener(Event.ENTER_FRAME, efListner,false,0,true); } function efListner(e:Event):void{ trace('c'); } } не привязывает ее к текущему классу, а делает глобальной... и это мешает удалению объекта. |
|
|||||
Регистрация: Nov 2006
Сообщений: 106
|
А у меня обькт всеравно не умер
package { import flash.display.MovieClip; public class Main extends MovieClip{ public function Main():void { var temp:Mc= new Mc(); addChild(temp); removeChild(temp); temp = null; } } } package { import flash.display.MovieClip; import flash.events.*; public class Mc extends MovieClip{ public function Mc():void { addEventListener(Event.ENTER_FRAME, handler); } private function handler(event:Event):void { trace("а я все живу!!!") } } } |
|
|||||
в AS3 нету никакой возможности стереть ненужный объект из памяти собственноручно,
он будет автоматически удалён сборщиком мусора если он посчитает что объект больше не используется. сборка мусора это ресурсоёмкий процесс, поэтому он выполняется не постоянно, а запускается время от времени - по мере необходимости толковая статья на эту тему: http://www.gskinner.com/blog/archive...source_ma.html в данном случае на объект не остаось живих ссылок и он будет удалён в следующем проходе, и вам нужно просто перед обнуление переменной удалить ENTER_FRAME листнер можно внутри Мс класса повесить листнер на удаление из дисплей листа и в нём удалять ENTER_FRAME
__________________
Хороший отдых - половина работы. Последний раз редактировалось artcraft; 29.11.2007 в 21:10. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Неплохо было бы подписаться на событие со слабой ссылкой.
Либо хак: package { import flash.display.MovieClip; import flash.events.*; import flash.net.LocalConnection; public class Main extends MovieClip{ public function Main():void { var temp:Mc= new Mc(); addChild(temp); removeChild(temp); temp = null; this.stage.addEventListener(MouseEvent.CLICK, function(e:Event):void{try{new LocalConnection().connect('gcForce');new LocalConnection().connect('gcForce');}catch(e:Error){}}); } } } Последний раз редактировалось etc; 29.11.2007 в 22:40. |
|
|||||
этот хак следует использовать только для тестирования, а в конечном продукте нужно стараться перед обнулением удалять все энтерфреймы, таймеры, таймауты, и весь остальной мусор который может срабатывать и после обнуления
в данном случае, слабая ссылака тут не при чём, ведь листнер находится внутри Mc класса
__________________
Хороший отдых - половина работы. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Да какая разница, где он находится?
Если объект-владелец больше ссылок не имеет, клип должен быть удален. |
|
|||||
та ссылка не препятствует удалению т.к. листнер находится внури обнулённого объекта, поэтому пользоваться слабой ссылкой нет никакой необходимости
__________________
Хороший отдых - половина работы. |
Часовой пояс GMT +4, время: 15:36. |
|
« Предыдущая тема | Следующая тема » |
|
|