Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Нужно ли и как удалять созданные фильтры? (http://www.flasher.ru/forum/showthread.php?t=174117)

windrunner31 18.01.2012 10:29

Нужно ли и как удалять созданные фильтры?
 
Создаю фильтр вот так:
Код AS3:

_sprite.filters = [new GlowFilter(16711680,50,20,20,3,3)];

Пока что,когда я хочу убрать фильтр я делаю так:
Код AS3:

sprite.filters = [];

Правильно ли это?Или все же фильтр - обьект и подлежит удалению как-то по другому?

Wolsh 18.01.2012 11:25

Если создаете именно таким способом, не создавая переменную класса для хранения ссылки на фильтр, то это нормальное удаление – ссылка, хранящаяся в массиве filters, будет удалена и экземпляр фильтра будет удален GC в надлежащее время. Если же сохранять фильтр в переменную, то достаточно необходимо и ее тоже обнулить, когда фильтр больше не нужен.

BuKT 18.01.2012 11:45

Вопрос в тему. Будет ли ошибка?
Код AS3:

_sprite.filters = [null, undefined, null]

Выполнится ли фильтр?
Код AS3:

_sprite.filters = [null, new BlurFilter(2,2,3), null]

И где можно почитать про воркфлоу фильтров?

goodguy 18.01.2012 11:57

Цитата:

Если же сохранять фильтр в переменную, то достаточно ее обнулить, когда фильтр больше не нужен.
Она ведь будет храниться в массиве фильтров. Оттуда тоже нужно будет снести

HardCoder 18.01.2012 12:27

Цитата:

Сообщение от goodguy (Сообщение 1057642)
Она ведь будет храниться в массиве фильтров. Оттуда тоже нужно будет снести

А почему она будет там хранится? Я всегда думал, что:
Код AS3:

var a:Object = new Object();
var b:Object = {c:a};
trace(b.c); //Object
a = null;
trace(b.c); //null


goodguy 18.01.2012 12:35

Ну, индекс элемента в массиве - это такая же ссылка. Приравнивание ссылки на объект к null в одном месте, не уничтожает сам объект. А раз уж ссылка на него есть еще и в массиве, то сборщик мусора его так же не уничтожит.
Код AS3:

var array:Array         = [];
var sprite:Sprite = new Sprite();
array.push(sprite);
sprite        = null;
trace(array[0]); // [object Sprite]

И в твоем случае null там не будет. Только что проверил.
Все будет так:
Код AS3:

var a:Object = new Object();
var b:Object = {c:a};
a = null;
trace(b.c)// [object Object]


HardCoder 18.01.2012 12:41

Цитата:

Сообщение от goodguy (Сообщение 1057654)
И в твоем случае null там не будет. Только что проверил.

Вот, я нехороший человек! Даже поленился проверить :D. Спасибо за наставление. Совсем забыл про аксиому "нужно удалять все ссылки".

Wolsh 18.01.2012 13:30

Цитата:

Она ведь будет храниться в массиве фильтров. Оттуда тоже нужно будет снести
Криво выразился, сорри. Подразумевалось естественно, что в случае с переменной обнулить массив недостаточно, надо обнулить и саму переменную. Но согласен, прозвучало так как будто обнулять массив не надо(((( мои извинения.

windrunner31 18.01.2012 14:52

Спасибо всем!

expl 18.01.2012 16:42

Цитата:

Сообщение от windrunner31 (Сообщение 1057631)
Создаю фильтр вот так:
Код AS3:

_sprite.filters = [new GlowFilter(16711680,50,20,20,3,3)];

Пока что,когда я хочу убрать фильтр я делаю так:
Код AS3:

sprite.filters = [];

Правильно ли это?Или все же фильтр - обьект и подлежит удалению как-то по другому?

Можно просто
Код AS3:

sprite.filters = null;

Оно и проще и лишний массив не создается.


Часовой пояс GMT +4, время: 18:41.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.