Удаление родителя в AS3: освобождает ли это память, используемую всеми детьми?
Я делаю довольно большой флеш-проект и поэтому беспокоюсь об использовании памяти. В конце каждого раздела приложения я удаляю всеобъемлющий родительский элемент, который содержит содержимое. Несмотря на то, что это удаляет родителя, это также освобождает память для каждого из дочерних элементов, содержащихся в этом, или я должен запустить итерацию, чтобы удалить тех, кто был до удаления родителя?
Я дам немного больше объяснений в случае, если я не выражаю то, что я хочу:
addChild(movie1);
movie1.addChild(movie2);
movie1.addChild(movie3);
Используя этот код:
removeChild(movie1);
Удаляет ли он movie2 и movie3 из памяти или они все еще сохранены, просто не связаны?
3 ответа
Ну, пока что ничего не удалено из памяти, это действительно зависит от того, как ссылается на movie1. Предположим, что позже в приложении, которое вы хотите добавить movie1 снова, вы должны обнаружить, что movie1 не только все еще здесь, но также содержит movie2 и movie3.
var movie1: MovieClip; без разницы(); anotherMethod (); функция что угодно ():void { movie1 = new MovieClip(); var movie2:MovieClip = new MovieClip(); var movie3:MovieClip = new MovieClip(); movie1.addChild(видеофильм2); movie1.addChild(movie3); AddChild (movie1); что угодно(); } функция whatElse():void { // здесь ничего не собирает мусор, movie1 существует снаружи // область действия этой функции RemoveChild (movie1); //Теперь вы можете попробуй это(); // но если вы сделаете это, вы фактически убиваете movie2 и movie3, так как // они нигде не упоминаются. RemoveChild(movie1); movie1 = ноль; // это приведет к ошибке, movie1 больше нет! попробуй это(); } функция tryThis():void { // да, он все еще здесь со всем своим содержанием AddChild(movie1); } function anotherMethod():void { var movieN:MovieClip = new MovieClip(); var movie2:MovieClip = new MovieClip(); var movie3:MovieClip = new MovieClip(); movieN.addChild(видеофильм2); movieN.addChild(movie3); // сделать все, что вам нужно сделать... // затем удалить ребенка (фильм N); убирайся(); } функция getOut():void { // жизнь продолжается без фильма N, movie2 & movie3 // ожидание сбора мусора }
Если movie2
а также movie3
на него больше не ссылается другой объект, они должны собираться мусором. То же самое относится и к movie1
,
От создания визуальных компонентов Flex в ActionScript:
Чтобы программно удалить элемент управления, вы можете использовать методы removeChild() или removeChildAt(). Вы также можете использовать метод removeAllChildren(), чтобы удалить все дочерние элементы управления из контейнера. Вызов этих методов фактически не удаляет объекты. Если у вас нет других ссылок на дочерний элемент, Flash Player включит их в сборщик мусора в будущем. Но если вы сохранили ссылку на этот дочерний элемент на каком-либо объекте, дочерний элемент не будет удален из памяти.
Конечно, он удаляет все 3.
В детском фильме 1 есть двое детей, в фильме 2 + 3. Если он умрет из-за какой-то инстанции, дети тоже могут умереть.
Может быть, я ошибаюсь, но вы также можете попробовать:
trace(movie2);