Сбой теста сборки мусора? - PullRequest
0 голосов
/ 04 ноября 2011

Я использую словарь со слабыми ключами, чтобы проверить, был ли объект собран мусором.Когда все ссылки на объект вне словаря будут удалены, я ожидаю, что словарь больше не будет заполняться.Кажется, это работает для объекта, но для спрайта это означает, что сборка мусора не состоялась.Может кто-нибудь сказать мне, что я пропускаю?

import flash.utils.Dictionary;

var dictionary:Dictionary=new Dictionary(true);
this.addEventListener(Event.ENTER_FRAME,collectionTest);
var sprite:Sprite=new Sprite();
dictionary[sprite]=true;
sprite=null;
trace(sprite);//traces null

function collectionTest(event:Event):void{
    var cleared:Boolean = true;
    for each (var key:* in dictionary) {
        cleared = false;
    }
    if (cleared) {
        trace("Collection Success.");
    } else {
        trace("Collection Failure");
    }
}

1 Ответ

1 голос
/ 04 ноября 2011

Я бы удалил ключ в качестве лучшей практики:

dictionary[sprite] = null;
delete dictionary[sprite];

Обратите внимание, что слабые ключи указывают, что ключ пригоден для сборки мусора и удаляется из таблицы, когда объект собирается. Маловероятно, что сборка мусора будет происходить непосредственно в вашей функции.

Словарь никогда не удалит слабые строковые ключи из таблицы.

Существует несколько известных проблем, связанных с методами, такими как ключи и сериализация AMF.

Вам нужно выделить немного памяти для запуска сборки мусора.

Используя ваш пример, я создал 1500 спрайтов, и ключ был удален за 4 кадра:

Выход:

ноль
Отказ коллекции
Отказ коллекции
Отказ коллекции
Коллекция Успех.

Пример кода:

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.utils.Dictionary;

    public class Test extends Sprite
    {

        public var dictionary:Dictionary = new Dictionary(true);

        public function Test()
        {
            addEventListener(Event.ENTER_FRAME, collectionTest);
            var sprite:Sprite = new Sprite();
            dictionary[sprite] = true;
            sprite = null;
            trace(sprite); //traces null
        }

        protected function collectionTest(event:Event):void
        {
            var cleared:Boolean = true;
            for each (var key:* in dictionary)
            {
                cleared = false;
            }
            if (cleared)
                trace("Collection Success.");
            else
                trace("Collection Failure");

            for(var i:uint = 0; i < 500; i++)
            {
                new Sprite();
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...