弱参考和强参考

时间:2010-05-06 12:16:18

标签: flex actionscript

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 个答案:

答案 0 :(得分:4)

类本身模拟弱引用,可以作为一个传递 如果没有对该值的其他弱引用,则会对其进行垃圾回收,因为对它的引用是通过具有弱(引用)键的字典建立的。

只要获得其中的值,就会获得对象本身的引用,就像ActionScript中的所有直接对象引用一样,它是一个强引用。只要您保留该引用,该对象就不会被垃圾回收。

编辑: 弱引用和强引用之间的差异
在执行程序期间,需要管理内存。低级语言要求您在不再需要对象时手动分配内存(获取可用空间)并释放它。更高级别的语言使用垃圾收集。这是一个试图确定是否仍然需要对象,或者是“垃圾”,即可以丢弃,释放所需内存的系统。为了确定是否需要对象,垃圾收集器试图找到“知道”该对象的其他对象,即具有对它的引用。当一个对象被其他对象引用时,它被保留(实际上它不是,因为否则未引用的对象可以循环引用彼此,但是我们不会过多地介绍细节)。
因此,“知道”/引用对象具有“保持活着”的副作用,因为它不能被移除。有时,这种副作用并不需要。例如,如果您需要一段时间内所有现有对象的列表以便更快地访问,那么使用此列表将使它们不被丢弃,即使该列表是唯一保持对它们的引用的对象。这就是为什么存在弱引用,与普通引用相反,也可以将其称为“强”,因为它们使对象不被垃圾收集。弱引用允许您引用对象,但被垃圾收集器忽略。这通常非常有用,如上所述。

格尔茨
back2dos