Использование памяти и сборка мусора объектов в AS3 - PullRequest
5 голосов
/ 01 июня 2011

Я хочу знать о типе Object, особенно когда речь идет о сборке мусора во Flash.

Я знаю, что элементы будут готовы к сборке мусора в таких ситуациях:

// create
var ar:Array = [];

var mc:MovieClip = new MovieClip();
mc.addEventLisntener(blah, blah);

ar.push(mc);
addChild(mc);

// kill & gc
ar.splice(0, 1);
mc.removeEventListener(blah, blah);
removeChild(mc);

Но как / 1007 * будет собирать мусор в ситуациях, подобных приведенным ниже.

Скажем, у меня в классе есть функция MartysMC, которую я анализирую Object через:

package
{
    import flash.display.MovieClip;

    public class MartysMC extends MovieClip
    {
        /**
         * Updates this
         * @param obj An object containing key/value pairs to represent new property values
         */
        public function update(obj:Object):void
        {
            var i:String;
            for(i in obj)
            {
                this[i] = obj[i];
            }
        }
    }
}

А теперь я использую эту функцию следующим образом:

var mmc:MartysMC = new MartysMC();

var dataObject:Object =
{
    x: 10,
    y: 34,
    alpha: 0.6
};

mmc.update(dataObject);

Что происходит с dataObject?Будет ли это собирать мусор отсюда?Даже все же, что об объекте в этой строке:

mmc.update({x:15,y:18,name:"marty"});

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

Чтобы увидеть, что происходит с GC, вы можете использовать Словарь со слабой ссылкой, установленной в true, и использовать объект, который вы хотите проверить как ключ:

var d:Dictionary = new Dictionary(true)
d[myObject] = whatever

, когдаобъект больше не будет доступен, он будет удален из словаря.

вот полный пример, основанный на вашем примере на wonderfl: http://wonderfl.net/c/e9W4

вы видите, что очень быстро оба ваших объектабыли собраны мусор.

2 голосов
/ 01 июня 2011

В вашем примере временный объект создается, передается в функцию, итерируется по его свойствам, после чего он должен собираться при следующем проходе GC.Там нет ничего, чтобы держать его в памяти (хотя GC pass может прийти не сразу, но нет возможности (пока) узнать это наверняка.) Если вы сомневаетесь, я бы добавил это свойство access (obj[i])не создает ссылок на временный объект - свойство просто копируется (основные типы по значению, а для классов ссылка копируется.)

...