Как отследить объекты для сбора мусора - PullRequest
0 голосов
/ 28 апреля 2010

Могу ли я узнать, как правильно следить за созданными экранными объектами и, следовательно, позвольте мне эффективно удалить его позже для сбора мусора. Например:

for(i=0; i<100; i++){
var dobj = new myClass(); //a sprite
addChild(dobj);
}

Из того, что я знаю, сборщик мусора во Flash будет собирать только объекты без надежных ссылок и подключенных слушателей событий.

Поскольку var dobj строго привязан к новому созданному объекту, мне придется его тоже "аннулировать", я прав?

Должен ли я создать массив для отслеживания всех объектов, созданных в цикле, таких как:

var objectList:Array = new Array();    

for(i=0; i<100; i++)
        {
            var dobj = new myClass(); //a sprite
            addChild(dobj);
            objectList.push(dobj);
        }

//remove all children
for each (var key in objectList)
{
     removeChild(key as myClass);
}

Позволяет ли это GC собирать его при развертке?

Ответы [ 3 ]

1 голос
/ 29 апреля 2010

var dobj - локальная переменная, поэтому после ваших функций эта ссылка исчезла. В этот момент единственной ссылкой будет тот факт, что элемент находится в списке отображения (то есть, что он отображается). Так что для сборки мусора не требуется никакой дополнительной работы, просто вам нужно удалитьChild (). Конечно, в других местах могут быть ссылки на него, такие как прослушиватели событий и т. Д.

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

0 голосов
/ 28 апреля 2010

Большинство сборщиков мусора отслеживают объекты при их создании. Решением для таких языков, как C ++ (и библиотека GC) является выделение памяти через оболочку new () Что-то вроде:

var dobj = myNew myClass (); // спрайт

Я не знаю слишком много о Flex GC, но обычно вы должны позволить ему делать свою работу. Если это основано на сильных ссылках, то это сработает.

0 голосов
/ 28 апреля 2010

Да, это позволяет GC собирать его, если у вас нет других сильных ссылок на него, и это то, что обычно делается во флэш-памяти.

Приведение в removeChild не является необходимым.

Кроме того, не забудьте установить для objectList значение null или новый Array () или установить для каждого его элемента значение null.

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