2010-04-28 1 views
0

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

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

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

Поскольку 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 собрать его на развертке?

+0

Либо аннулировать его, либо позволить ему выйти из сферы действия. Но так как это передача ссылки объекта на функцию, которая (я предполагаю) сохраняет ссылку, ссылка на объект все еще действительна. – amphetamachine

ответ

1

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

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

0

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

Однако приведение в removeChild необязательно.

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

0

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

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

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