Для начала приведу пример как объект с “сильной” ссылкой продолжает лежать в памяти.

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 Слабые ссылки”

  1. Можно пример с WeakRef? Лично я не вижу смысла в этом классе.

    PS: Вызвать сборщик мусора можно в дебаг плеере командой System.gc();

    Думаю было бы логично вставить эту команду после obj1 = null; и obj2 = null; в примере StrongReferencesExample

  2. просто эти ссылки можно потерять, хотя они и остануться, это больше актуально для игр, там где очень много объектов.
    Жаль только то, что System.gc(); в Realese плеере не работает( И всё равно System.gc(); не убъет объекты пока на них есть ссылки.

  3. deep says:

    Ты не от сюда вдохновлялся
    http://code.google.com/p/flash-console/source/browse/trunk/src/com/junkbyte/console/vos/WeakRef.as

    Кстати советую обратить внимание на саму консоль по ссылке.

  4. Я давно это где-то видел. Не помню где. Спасибо за линк, видимо там интересно должно быть

Leave a Reply