Вопрос сборки мусора (список отображения + actioncript) - PullRequest
0 голосов
/ 01 сентября 2011

Если я добавляю объект, расширяющий MovieClip или Sprite, и удаляю этот объект со сцены, нужен ли метод уничтожения, если:

  1. К этому объекту не подключены прослушиватели событий
  2. Я добавил экранные объекты к этому объекту? (obj.addChild (что угодно) -> мне нужно удалить «что угодно», когда я удаляю объект из списка отображения или это избыточно?)
  3. Любые переменные экземпляра, связанные с этим объектом - нужно ли обнулять их?

1 Ответ

2 голосов
/ 01 сентября 2011

Если вы удаляете все ссылки на родительский объект, нет необходимости удалять его дочерние объекты 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 работать в режиме отладки, если вы хотите проверить эти идеи.

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