2010-05-06 83 views
5
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; 
     } 
    } 
} 

在這個類中,它們是如何表示弱引用和強引用的。弱引用和強引用

回答

4

該類本身模擬弱引用,並可以作爲一個傳遞。
如果沒有其他弱引用的值,它是垃圾收集,因爲它的引用是通過具有弱(參考)鍵的字典建立的。

只要獲得內部值,就會獲得對象本身的引用,與ActionScript中所有直接對象引用一樣,該引用是強引用。只要你保留這個引用,對象就不會被垃圾收集。

編輯:
強和弱引用之間
差異程序的執行過程中,內存需要管理。低級語言要求您在不再需要對象時手動分配內存(獲得空閒空間)並釋放內存。高級語言使用垃圾收集。這是一個系統,試圖確定是否仍然需要對象,或者是「垃圾」,即可以丟棄,釋放他們需要的內存。爲了確定是否需要對象,垃圾收集器會嘗試查找其他對象,即「知道」此對象,即有對它的引用。當一個對象被其他對象引用時,它被保留(實際上它不是,因爲否則未被引用的對象可以循環引用對方,但是我們不要太詳細)。
因此,「知道」/引用一個對象具有「保持活着」的副作用,因爲它不能被刪除。有時候,這種副作用是不需要的。例如,如果您需要一段時間的所有現有對象的列表以便更快地訪問,則使用此列表可以防止它們被丟棄,即使該列表是唯一持有對它們的引用的對象。這就是爲什麼有弱引用的原因,相比之下,正常引用也可以被稱爲「強」,因爲它們可以防止對象被垃圾收集。弱引用允許你引用一個對象,但被垃圾收集器忽略。如上所述,這通常會非常有幫助。

格爾茨
back2dos

+0

你能不能給我弱和強引用的定義。我無法得到。對不起 – Kevin 2010-05-06 12:27:06

+0

@theband:請參閱我的更新。另外,您可能需要查看http://en.wikipedia.org/wiki/Reference_counting#Use_in_garbage_collection瞭解更多詳情。 – back2dos 2010-05-06 12:54:36

+0

謝謝了更新 – Kevin 2010-05-07 12:49:58