PDA

Просмотр полной версии : Корректное удаление объекта


Quadro9
05.10.2015, 14:50
допустим у меня в векторе хранятся объекты которые я хочу удалить.
я делаю
var layer:Layer;
for (var i:int = _layers.length-1; i >= 0; i--)
{
layer = _layers[i];
if (layer.hasEventListener(StateEvent.CHANGE_STATE))
{
layer.removeEventListener(StateEvent.CHANGE_STATE, dispatchEvent);
}
layer.dispose();
_layers.pop();
}
при условии что dispose() этих объектов написан правильно, этого достаточно?

Теперь сам dispose, если в объекте который я удаляю есть массив, то после удаления всех элементов из него, нужно занулить сам массив? Что еще нужно занулять? Все объекты который созданы через new?
А ссылки на объекты которые были переданы из вне? Number'ы и Boolean'ы занулять не нужно?
public function dispose():void
{
for (var i:int = _items.length-1; i >= 0; i--)
{
_items[i].dispose();
_items.pop();
}
_items = null;
_rect = null;
_model = null;
}

Поправьте или подтвердите пожалуйста мои предположения

КорДум
05.10.2015, 14:56
if (layer.hasEventListener(StateEvent.CHANGE_STATE))
Этой проверки делать не нужно, removeEventListener корректно отработает, если слушатель не присоединен.
for (var i:int = _items.length-1; i >= 0; i--)
{
_items[i].dispose();
_items.pop();
}
Замените на for each; и pop() делать не нужно, так как после цикла идет
_items = null;
Аналогичная правка к первому циклу.

Простые типы занулять не нужно. Кроме того, если уничтожается полностью весь контейнер со всем его содержимым, достаточно убрать только слушатели событий, которые МОГУТ произойти (enterFrame, timerTick и тому подобные), — чтобы они не срабатывали после удаления, но до того, как GC все заберет. GC сам уничтожит все, что надо. Другими словами, нужно отрубить один раз всю ветку дерева, чем ломать ее по чуть-чуть много раз, чтобы в итоге прийти к тому же.
Исключение из правил - всякие XML, BitmapData, Socket и тому подобное, у чего нужно вызывать dispose/disconnect руками.

Quadro9
05.10.2015, 16:26
а String'и нужно занулять или они тоже простые типы?

КорДум
05.10.2015, 16:41
Тоже простой.