Слабая ссылка и Сильная ссылка - PullRequest
5 голосов
/ 06 мая 2010
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;
        }
    }
}

В этом классе, как они обозначают одну как слабую ссылку, а другую - как сильную ссылку.

1 Ответ

4 голосов
/ 06 мая 2010

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

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

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

Greetz
back2dos

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...