Слабая ссылка и Сильная ссылка

package uk.co.bigroom.utils 
{
    import flash.utils.Dictionary;
    /**
     * Class to create a weak reference to an object. A weak reference
     * is a reference that does not prevent the object from being
     * garbage collected. If the object has been garbage collected
     * then the get method will return null.
     */
    public class WeakRef
    {
        private var dic:Dictionary;

        /**
         * The constructor - creates a weak reference.
         * 
         * @param obj the object to create a weak reference to
         */
        public function WeakRef( obj:* )
        {
            dic = new Dictionary( true );
            dic[obj] = 1;
        }

        /**
         * To get a strong reference to the object.
         * 
         * @return a strong reference to the object or null if the
         * object has been garbage collected
         */
        public function get():*
        {
            for ( var item:* in dic )
            {
                return item;
            }
            return null;
        }
    }
}

В этом Классе, как они обозначают тот как Слабую ссылку и один как Сильная ссылка.

5
задан Kevin 6 May 2010 в 12:16
поделиться

1 ответ

сам класс эмулирует слабую ссылку, и может передаваться как слабая ссылка.
если нет других слабых ссылок на значение, оно собирается в мусор, поскольку ссылка на него устанавливается через словарь со слабыми (ссылочными) ключами.

как только вы получаете значение внутри, вы получаете ссылку на сам объект, которая, как и все прямые ссылки на объект в ActionScript, является сильной ссылкой. пока вы сохраняете эту ссылку, объект не будет собран в мусор.

edit: Разница между слабыми и сильными ссылками
Во время выполнения программы необходимо управлять памятью. Языки низкого уровня требуют вручную выделять память (получать свободное место) и освобождать ее, когда объект больше не нужен. Языки более высокого уровня используют сборку мусора. Это система, которая пытается определить, нужны ли еще объекты, или они являются "мусором", т.е. могут быть выброшены, освободив требуемую память. Чтобы определить, нужен ли объект, сборщик мусора пытается найти другие объекты, которые "знают" этот объект, т.е. имеют на него ссылку. Если на объект ссылаются другие объекты, он сохраняется (на самом деле это не так, поскольку иначе нессылочные объекты могут циклически ссылаться друг на друга, но не будем слишком углубляться в детали).
Таким образом, "знание"/ссылка на объект имеет побочный эффект "поддержания его жизни", поскольку он не может быть удален. Иногда этот побочный эффект не учитывается. Например, если вам нужен список всех существующих объектов некоторого времени для более быстрого доступа, то наличие этого списка не позволит им быть удаленными, даже если этот самый список является единственным объектом, хранящим ссылки на них. Именно поэтому существуют слабые ссылки, в отличие от обычных ссылок, которые также можно назвать "сильными", поскольку они не дают объекту быть собранным в мусор. Слабые ссылки позволяют ссылаться на объект, но при этом игнорируются сборщиком мусора. Часто это может быть очень полезно, как в случае, описанном выше.

greetz
back2dos

4
ответ дан 15 December 2019 в 00:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: