![]() |
|
||||||||||
|
|||||
|
Регистрация: Aug 2007
Сообщений: 467
|
Может попробуй сделать список для хранения свох МувиКлипов(сам не тестил, писал находу):
var mсList:MovieClip = new MovieClip(); // хотя хватит и просто Sprite
addChild(mсList);
...
var mc = new myNewMc();
mc.addEventListener(MouseEvent.CLICK, mcClick);
mcList.addChild(mc);
...
function mcClick(event:MouseEvent):void
{
DisplayObject(event.target).removeEventListener(MouseEvent.CLICK, mcClick);
mcList.removeChild(DisplayObject(event.target));
// Здесь может быть могут быть нюансы с event.target :)
}
Последний раз редактировалось 2morrowMan; 23.08.2007 в 04:03. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
removeChild не удалит клип из памяти, только из Display list.
|
|
|||||
|
Регистрация: Aug 2007
Сообщений: 467
|
Может быть проблема автора поста в том, что он создает обработчик события для МувиКлипа и не удаляет его (removeEventListener()) и потом GC не удаляет этот МувиКлип из памяти...
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Какой обработчик? Нет там никаких обработчиков, я привел пример живущего клипа без всяких обработчиков.
|
|
|||||
|
Да, всё хорошо..
Я разобрался с этим. Память просто отчищасется в редких случаях походу только когда её хватать перестаёт.. |
|
|||||
|
__etc, обработчик там все таки есть. Откудато trace('hello') происходит же.
Удалив из первого кадра MyClip'а и написав так: var mc:MovieClip = new MyClip();
mc.addEventListener('enterFrame', traceHello);
addChild(mc);
function traceHello(e:Event):void {
trace('hello');
}
function clickHandler(event:Event):void {
mc.removeEventListener('enterFrame', traceHello);
removeChild(mc);
}
stage.addEventListener(MouseEvent.CLICK, clickHandler);
Ну а если надо экземпляр класс удалить, то предлогаю написать функцию destroy package {
import flash.display.*;
import flash.events.*;
public class MyClip extends MovieClip {
public function MyClip():void {
trace('myclip init');
this.addEventListener('enterFrame', traceHello);
}
private function traceHello(e:Event):void {
trace('hello');
}
public function destroy():void {
this.removeEventListener('enterFrame', traceHello);
}
}
}
Последний раз редактировалось Dima_DPE; 23.08.2007 в 15:32. |
|
|||||
|
2Dima_DPE
Этот способ хорош для того чтобы подготовить клип к его смерти. но в памяти он будет еще долго жить.. У __etcта тейс идёт не от Евента, а он того что клип зацикленно проигрывает анимацию на своём таймлайне. В следствии чего перед удалением клип лучше еще и остановить stop() чтобы успокоить его душу) |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Dima_DPE, это не освободит память, уже проверено. Мы просто скрываем от себя самого существование клипа. Как тогда объяснишь принудительное срабатывание GC? Если ссылки есть, он не удалит клип никогда. Если удаляет, значит все-таки ссылок нет, но удаление не происходит автоматически.
|
|
|||||
|
Flash Aксакал
Регистрация: Jun 2005
Сообщений: 636
|
Единственная проблемы с принудительным запуском GC - сколько времени это занимает, у меня заняло 7ms...
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Сразу он не срабатывает, а во флексе даже на enterFrame не срабатывает. Возможно, это из-за иной схемы тестирования.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 11:17. |
|
|
« Предыдущая тема | Следующая тема » |
|
|