У меня есть словарь, в котором хранятся данные для мувиклипов, и я хочу, чтобы данные собирались мусором, если я перестаю использовать мувиклипы. Я использую параметры слабых ключей, и они отлично работают с другими данными, однако я столкнулся с проблемой.
Этот код прекрасно работает:
var mc = new MovieClip();
var dic = new Dictionary(true);
dic[mc] = 12;
mc = null;
System.gc();
System.gc();
for (var obj in dic)
trace(obj); //this doesn't execute
Но когда я на самом деле использую мувиклип, он перестает работать:
var mc = new MovieClip();
var dic = new Dictionary(true);
dic[mc] = 12;
addChild(mc);
removeChild(mc);
mc = null;
System.gc();
System.gc();
for (var obj in dic)
trace(obj); //this prints [object Movieclip]
Почему это происходит? Я что-то не так делаю? Есть ли обходной путь?
Редактировать: я знаю, что для этого конкретного примера я могу использовать delete dic[mc]
, но, конечно, это упрощенный случай. В общем, я не хочу вручную удалять мувиклип из словаря, но он должен быть автоматическим, когда я больше не ссылаюсь на него в остальной части приложения.
Edit2: я пытался проверить то, что сказал Аарон, и придумал просто странные вещи ... просто итерация словаря (ничего не делая) меняет поведение:
var mc = new MovieClip();
var dic = new Dictionary(true);
dic[mc] = 12;
addChild(mc);
removeChild(mc);
mc = null;
for (var objeto in dic) {} // <-- try commenting out this line
addEventListener('enterFrame', f); // I print the contents every frame, to see if
// it gets removed after awhile
function f(evento)
{
System.gc();
System.gc();
for (var objeto in dic)
trace(objeto);
}
Это продолжает печатать [объект Movieclip] каждый кадр, если я не закомментирую указанную строку, где он ничего не печатает.