PDA

Просмотр полной версии : "правильное" уничтожение экземпляра класса


firsoff
01.07.2008, 18:05
Есть визуальный класс, который делает некоторую работу, по окончании которой его нужно удалить. ссылка на экземпляр созданного класса хранится как свойство экземпляра класса "менеджера" (может сложно выражаюсь). Удаляю следующим образом:
1. removeChild
2. удаляю все события связанные с экз. визуального класса (или проще использовать useWeakRefence = true)
3. делаю свойство экземпляра класса "менеджера" = null
Все ли верно? Удалит ли после этих событий "сборщик мусора" ненужный визуальный класс в памяти?
C уважением.

ramshteks
01.07.2008, 18:07
думаю первое нужно сделать последним... если уж на то пошло)
может я ошибаюсь)

etc
01.07.2008, 18:12
может я ошибаюсь)
Ошибаетесь.

firsoff, примерного кода отсюда не видно, а по терминологии ясности нет.

firsoff
01.07.2008, 18:34
package
{
import flash.display.Sprite;
import flash.events.Event;

public class Master extends Sprite
{
private var _slave:Slave;
// CONSTRUCTOR
// КЛасс хозяин
public function Master()
{
_slave = new Slave();
// используем мягкие ссылки
_slave.addEventListener(Event.ADDED_TO_STAGE, handleAdded, false, 0, true);
addChild(_slave);
someWork();

// удаление из памяти
removeChild(_slave);
_slave = null;
// ну все сборщик милости просим (вызываем известный хак для GarbageCollector)
};

private function someWork():void
{
/*
* какая то работа с _slave
* */
};

private function handleAdded(event:Event):void
{
// обработчик просто для примера
};
};

public class Slave extends Sprite
{

// CONSTRUCTOR
public function Slave()
{
// визуальный класс
};


};
};


Проблема в том что "slave" классов визуальных много, и в какой то момент их надо все удалит и пересоздать с новым контентом и так много раз, и мне хочется чтобы ненужные экземпляры точно удалялись сборщиком а не висели мертвым грузом.

etc
01.07.2008, 19:00
package
{
import flash.display.Sprite;
import flash.events.Event;

public class Master extends Sprite
{
private var _slave:Slave;
// CONSTRUCTOR
// КЛасс хозяин
public function Master()
{
_slave = new Slave();
// используем мягкие ссылки
_slave.addEventListener(Event.ADDED_TO_STAGE, handleAdded, false, 0, true);
addChild(_slave);
someWork();

// удаление из памяти
removeChild(_slave);
_slave = null;
// ну все сборщик милости просим (вызываем известный хак для GarbageCollector)
};

private function someWork():void
{
/*
* какая то работа с _slave
* */
};

private function handleAdded(event:Event):void
{
// обработчик просто для примера
};
};

public class Slave extends Sprite
{

// CONSTRUCTOR
public function Slave()
{
// визуальный класс
};


};
};


Проблема в том что "slave" классов визуальных много, и в какой то момент их надо все удалит и пересоздать с новым контентом и так много раз, и мне хочется чтобы ненужные экземпляры точно удалялись сборщиком а не висели мертвым грузом.
Хак использовать не надо. Слабые ссылки тоже, надо отписываться от событий. И проблем не будет.

firsoff
01.07.2008, 20:43
меня больше интересует если _slave = null не сделать, то экземпляр класса останется в памяти? ведь получается на него остается ссылка в экз. класса Master, иными словами присвоение null обязательно?