2010-05-06 10 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; 
     } 
    } 
} 

En esta clase, cómo denotan una como referencia débil y una como referencia fuerte.Referencia débil y Referencia fuerte

Respuesta

4

la clase en sí emula una referencia débil, y se puede pasar como una sola.
si no hay otras referencias débiles al valor, es basura recolectada, ya que la referencia a ella se establece a través de un diccionario con claves débiles (de referencia).

tan pronto como obtenga el valor dentro, obtendrá una referencia del objeto en sí, que, como todas las referencias de objetos directos en ActionScript, es una referencia sólida. siempre que mantenga esa referencia, el objeto no será basura recolectada.

edición:diferencia entre las referencias débiles y fuertes
Durante la ejecución de un programa, la memoria debe ser gestionado. Los idiomas de bajo nivel requieren que asigne memoria manualmente (obtenga espacio libre) y la libere cuando el objeto ya no se necesite. Los idiomas de nivel superior usan la recolección de basura. Este es un sistema que intenta determinar si los objetos aún se necesitan o si son "basura", es decir, se pueden descartar, liberando la memoria que requieren. Para determinar si un objeto es necesario, el recolector de elementos no utilizados intenta encontrar otros objetos que "conozcan" este objeto, es decir, que tengan una referencia al mismo. Cuando un objeto es referenciado por otros objetos, se conserva (de hecho, no lo es, ya que de lo contrario los objetos sin referencia pueden referirse cíclicamente entre sí, pero no entremos demasiado en los detalles).
Por lo tanto, "conocer"/hacer referencia a un objeto tiene el efecto secundario de "mantenerlo vivo", ya que no se puede eliminar. Algunas veces, este efecto secundario no es deseado. Por ejemplo, si necesita una lista de todos los objetos existentes de algún tiempo para un acceso más rápido, tener esta lista evitaría que se descarten, incluso si esa misma lista es el único objeto que contiene referencias a ellos. Esta es la razón por la cual hay referencias débiles, a diferencia de las referencias normales que también pueden denominarse "fuertes" ya que evitan que el objeto sea recolectado como basura. Las referencias débiles le permiten hacer referencia a un objeto, pero el recolector de basura las ignora. Esto a menudo puede ser muy útil, como en el caso descrito anteriormente.

greetz
back2dos

+0

¿Me puede dar la definición de referencia débil y fuerte. no puedo obtener lo siento – Kevin

+0

@theband: por favor vea mi actualización. Además, es posible que desee consultar http://en.wikipedia.org/wiki/Reference_counting#Use_in_garbage_collection para obtener más detalles. – back2dos

+0

Gracias mucho por la actualización – Kevin

Cuestiones relacionadas