Если вы удаляете все ссылки на родительский объект, нет необходимости удалять его дочерние объекты DisplayObjects или обнулять его переменные-члены, если нет внешних ссылок на эти дочерние объекты.
Flash использует сборщик мусора "mark-sweep". Чтобы определить, какие объекты пригодны для сбора мусора, Flash начинает с самого верхнего элемента Stage
и перебирает все найденные ссылки, помечая объекты по мере их поступления. Любые объекты, которые не были отмечены, недоступны и будут иметь право на сборку мусора.
Представьте себе объект черного ящика. Если вы удалите все ссылки на это поле, он будет иметь право на сборку мусора. Теперь представьте, что в этом черном ящике действительно было много подобъектов. Даже если среди родительского черного ящика и дочерних объектов могут быть ссылки, это не меняет того факта, что сам черный ящик недоступен, поэтому все эти «внутренние» ссылки не имеют значения. Эти объекты будут иметь право на сборку мусора. Вы оторвали ветку от дерева, хотя у самой ветви может быть много ответвлений и вилок меньшего размера.
Вот простой пример:
var obj:MySprite = new MySprite();
obj.foo = new Foo();
obj.addChild(new Sprite());
addChild(obj);
Как мы очищаем obj
и его подкомпоненты? Все, что нужно, это:
removeChild(obj);
obj = null;
Теперь obj
недоступен, как и его дочерние компоненты. Все они имеют право на сбор мусора.
Вы должны быть осторожны, если у вас есть внешние ссылки на эти дочерние объекты, однако:
var obj2:Sprite = new Sprite();
obj.addChild(obj2);
obj = null;
Даже если мы обнулили obj
, мы забыли обнулить obj2
, так что это не будет сбор мусора. Родительский объект obj
также не будет собирать мусор, поскольку obj2.parent
ссылается на него. Если obj
является нашим черным ящиком, то наша ссылка на obj2
указывает внутри черного ящика!
Следовательно, при очистке объекта может быть полезно обнулять и удалять объекты, особенно в запутанных ситуациях, когда это неясно. Вы всегда будете в безопасности, если удалите их, но в итоге вы можете написать ненужный код.
Если вы хотите взглянуть на происходящее, может быть полезно использовать инструменты профилирования в Flash Builder, FlashDevelop или FDT, чтобы взглянуть на использование памяти. Вы можете использовать вызов System.gc () , чтобы заставить GC работать в режиме отладки, если вы хотите проверить эти идеи.