У меня проблемы с созданием функции очистки для сборки мусора [пример внутри] - PullRequest
0 голосов
/ 10 января 2012

Я пытаюсь использовать глобальную функцию очистки и передать MovieClip или TextField для удаления. Я хочу удалить клип, не ссылаясь на клип напрямую. Любая помощь будет принята с благодарностью.

var clip:Sprite = new Sprite();
clip.graphics.beginFill(0x000000, 1)
clip.graphics.drawRect(0,0,100,100)
clip.graphics.endFill()
clip.name = "clip"
addChild(clip);

cleanup(clip)

function cleanup(mc):void {
    removeChild(mc.parent.getChildByName(mc.name));
    mc = null

    // clip is removed and traces as [object Sprite]
    trace(clip)

    //
    addChild(clip);
    removeChild(clip)
    clip = null

    // clip is removed and traces as null.
    trace(clip)
}

Вот FLA (Flash cs4): http://dl.dropbox.com/u/4725599/test-cs4.zip

Ответы [ 2 ]

3 голосов
/ 10 января 2012

Вы, кажется, неправильно понимаете сферу.Я попытаюсь объяснить, что вы делаете:

function cleanup(mc):void {
    removeChild(mc.parent.getChildByName(mc.name)); // removes the "clip" sprite
    mc = null; // nulls the local var "mc", which essentially does nothing

    addChild(clip);     // re-add the "clip" sprite
    removeChild(clip)   // remove the "clip" sprite
    clip = null;        // null the "clip" sprite, removing the last reference to the memory allocated for the sprite
}

Обычно, когда вы создаете Sprite, вы выделяете память, необходимую для Sprite, и назначаете ее для * 1006.* переменная.Ваш спрайт теперь имеет одну ссылку на него.

Затем вы добавляете его на сцену.Это создает новую ссылку, поэтому у вашего спрайта теперь есть 2 ссылки.Вот и все.

Переменная mc в функции cleanup() является временной переменной - они очищаются после выхода из функции, поэтому вам не нужно об этом беспокоиться.Чтобы пометить ваш Sprite для сборки мусора, вам нужно удалить 2 ссылки на него: переменную clip и сцену.Так что вам просто нужно сделать:

clip.parent.removeChild( clip );
clip = null;

И это сделано.

Проверьте, что: http://divillysausages.com/blog/tracking_memory_leaks_in_as3 (заявление об отказе: мой сайт), которое должно дать вам хорошее объяснениекак память работает в as3

Edit Обычно вы работаете на основе классов.Во всех моих классах я реализую функцию destroy(), которую я могу вызывать для очистки класса (удаление дочерних элементов, прослушивателей событий, любых ссылок на другие объекты и т. Д.).Для кода, вызывающего destroy(), его не волнует, что делает объект или как он работает, он просто знает, что впоследствии этот объект хорош для сборки мусора.

Как правило, объект, создающий что-тотакже несет ответственность за его уничтожение.

1 голос
/ 10 января 2012

Имейте в виду, что то, что вы делаете - удаление экранного объекта из списка отображения родителя - может быть недостаточно. Чтобы иметь право на сборщик мусора, каждый слушатель, назначенный этому объекту, также должен быть удален. И, если на объект ссылаются в другом месте, например, в массиве, он не будет правильно собирать мусор. Я говорю о том, что, вероятно, попытаться написать функцию для GC не так просто. Я обычно располагаю каждый объект вручную. Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...