Достаточно ли removeChild, чтобы полностью удалить мувиклип из памяти Flash Player? - PullRequest
1 голос
/ 26 июля 2011

Будет ли эта строка

clip.removeChild(clip.getChildAt(0));

полностью удалить дочерний элемент клипа с индексом 0?Я где-то читал, что вы должны установить null для всех ссылок на этот клип, но у меня нет других ссылок в моем коде.Клип в 0 был добавлен через обычный addChild().

Ответы [ 4 ]

1 голос
/ 26 июля 2011

Чтобы сборщик мусора ударил ваш объект, вы должны:

-not have any other reference to the object throughout your code
-the object shouldn't be part of any collection (like Array or Vector)
-the current reference should be set to null

Обязательно обращайте дополнительное внимание на второе условие. Наиболее распространенная ситуация, когда объект является частью коллекции, которой вы не можете напрямую управлять, - это когда к нему подключен слушатель и когда он является частью списка отображения. Кроме того, существуют другие ситуации, когда объект является частью коллекции, которой вы можете управлять, не забудьте также удалить ее из формы.

Кроме того, чтобы заставить сборщик мусора сильно ударить объект (только для тестирования, а не для производства), вы можете использовать System.gc(), а затем проверить память с помощью System.privateMemory

1 голос
/ 26 июля 2011

если вы удаляете их в цикле, сделайте это следующим образом:

while (clip.childNum > 0)
{
   var child:MovieClip = clip.getChildAt(0);
   clip.removeChild(child);

   // remove all listeners
   child.removeEventListener(...);

   child = null;
}

если "child" - это пользовательский класс, вы можете вызвать метод kill (), чтобы очистить все внутри вашего класса/instance.

0 голосов
/ 26 июля 2011

Если у вас нет ни ссылок, ни слушателей, ни каких-либо других дескрипторов клипа, он в конечном итоге будет собираться мусором.Из-за того, как работает GC, он не может быть немедленно удален из памяти.Однако ваш DisplayObject будет немедленно удален из списка отображения.

Но если вы сделаете что-то подобное в одном из ваших классов:

private var mc:MovieClip = new MovieClip();

private function addClip() : void {
    mc.addEventListener(Event.ENTER_FRAME, myListener);
    myClass.addChild(mc);
}

Тогда вам нужно будет удалить mc вот так:

private function removeClip() : void {
    mc.removeEventListener(Event.ENTER_FRAME, myListener);
    myClass.removeChild(mc);
    mc = null;
}
0 голосов
/ 26 июля 2011

Не уверен, что если у вас еще есть ссылка на клип, сборщик мусора может разрушить объект, попробуйте удалить прослушиватель событий и принудительно установить ссылку на клип на ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...