Для начала приведу пример как объект с “сильной” ссылкой продолжает лежать в памяти.
package { import flash.display.Sprite; /** * ... * @author Sergey Gonchar */ public class StrongReferencesExample extends Sprite { public function StrongReferencesExample() { // создадим новый объект obj1 и его копию obj2 var obj1:Object = new Example(); var obj2:Object = obj1; // протрейсим trace(obj1); // [object Example] trace(obj2); // [object Example] // удаляем Example из obj1, но obj2 остается в памяти obj1 = null; trace(obj1); // null trace(obj2); // [object Example] // Example не будет свободен из памяти //пока все ссылки на него не будут уничтожены obj2 = null; trace(obj1); // null trace(obj2); // null } } } class Example {}
Т.е. пока существует “сильная” ссылка на объект, он по-любому не сможет быть съеден GC. Для того, чтобы объект имел права на удаление, но при этом в коде были ссылки на него, нужно использовать слабые ссылки. Они предотвращают утечку памяти.
Существует только два способа создать слабые ссылки на объект
1. в addEventListener установить свойство useWeakReference = true
2. использовать объекты как ключи в Dictionary
Рассмотрим как использовать второй способ. Напишем простенький класс:
package { import flash.utils.Dictionary; public class WeakRef { private var dict:Dictionary; public function WeakRef( obj:* ) { dict = new Dictionary( true ); dict[obj] = 1; } public function get():* { for ( var item:* in dict ) { return item; } return null; } } }
По сути тут всё просто. Если метод get() возвращает null, то объект был съеден GC, если нет, то ссылку на объект.
// Создаем слабую ссылку var weak:WeakRef = new WeakRef( obj ); var strong = weak.get(); if (strong != null ) { // юзаем объект тут } else { // Garbage Collector всё съел }
Надеюсь этот небольшой хак вам поможет!
4 Responses to “AS3 Слабые ссылки”



Можно пример с WeakRef? Лично я не вижу смысла в этом классе.
PS: Вызвать сборщик мусора можно в дебаг плеере командой System.gc();
Думаю было бы логично вставить эту команду после obj1 = null; и obj2 = null; в примере StrongReferencesExample
просто эти ссылки можно потерять, хотя они и остануться, это больше актуально для игр, там где очень много объектов.
Жаль только то, что System.gc(); в Realese плеере не работает( И всё равно System.gc(); не убъет объекты пока на них есть ссылки.
Ты не от сюда вдохновлялся
http://code.google.com/p/flash-console/source/browse/trunk/src/com/junkbyte/console/vos/WeakRef.as
Кстати советую обратить внимание на саму консоль по ссылке.
Я давно это где-то видел. Не помню где. Спасибо за линк, видимо там интересно должно быть