AS 3.0 (flash.utils.Dictionary)
Posted by Administrador | Filed under Actionscript 3.0
La clase Dictionary es una de las nuevas herramientas que incorpora AS 3.0 y que sirve para la colección dinámica de propiedades insertando un objeto como llave(key). Acepta cualquier tipo de objeto (Sprite ,Boolean, Number, Uint,String…). Es otra forma de array asociativo, también llamado hash o maps (colecciones desordenadas), pero que a diferencia del uso de llaves con cadena de texto lo hace con objetos.
import flash.utils.Dictionary;
var a:Object = new Object();
var b:Object = new Object();
var dict:Dictionary = new Dictionary();
dict[a] = 1;
dict[b] = 2;
for (var prop:* in dict) {
trace(prop); // trace: [object Object], [object Object]
trace(dict[prop]); // trace: 1, 2
}
Otra de las cosas importantes es que la clase Dictionary utiliza igualdad terminante (===) . Esto significa que diversas referencias al mismo objeto actuarán como la misma llave:
import flash.utils.Dictionary;
var a:Object = new Object();
var b:Object = a;
var dict:Dictionary = new Dictionary();
dict[a] = "hola";
trace(dict[b]); // trace 'hola' porque a===b
A continuación os pongo un ejemplo para que veáis un caso práctico simulado:
import flash.utils.Dictionary;
import clases.Articulo;
import clases.Noticia;
import clases.Composicion;
var miDiccionario:Dictionary = new Dictionary();
// objetos que seran usados como llave
var composicion1:Composicion = new Composicion("lorem ipsum...","Titulo 1");
var composicion2:Composicion = new Composicion("lorem ipsum...","Titulo 2");
var composicion3:Composicion = new Composicion("lorem ipsum...","Titulo 3");
var composicion4:Composicion = new Composicion("lorem ipsum...","Titulo 4");
var composicion5:Composicion = new Composicion("lorem ipsum...","Titulo 5");
var composicion6:Composicion = new Composicion("lorem ipsum...","Titulo 6");
var composicion7:Composicion = new Composicion("lorem ipsum...","Titulo 7");
// objetos que se usan como valor
var grupoArticulo:Articulo = new Articulo();
var grupoNoticia:Noticia = new Noticia();
//añadimos valores al diccionario
miDiccionario[composicion1] = grupoArticulo;
miDiccionario[composicion2] = grupoNoticia;
miDiccionario[composicion3] = grupoArticulo;
miDiccionario[composicion4] = grupoNoticia;
miDiccionario[composicion5] = grupoArticulo;
miDiccionario[composicion6] = grupoNoticia;
miDiccionario[composicion7] = grupoArticulo;
//metodo devuelve composiciones
public function devuelveElementos( diccionario : Dictionary, objetoComparador:Object ) : void
{
for (var llave:Object in diccionario) {
if (diccionario[llave] == objetoComparador) {
trace("se ha encontrado");
trace(llave.getTitulo());
// trace Titulo 1.…
trace(llave.getDescripcion());
//trace lorem ipsum.…
trace(diccionario[llave]);
//trace [object Articulo]
}
}
}
//llamamos ahora al metodo devuelveElementos y q me haga un trace cada vez q se encuentre una composicion del grupo que le pasemos a comparar.
devuelveElementos(miDiccionario,grupoArticulo);
La clase Dictionary acepta un parámetro booleano en su constructor para referirnos si todas las llaves que añadimos en ella queremos que sean referencias débiles o no.
AS 3.0 utiliza un sistema de colección de basura para recuperar la memoria que ya no se utiliza . Cuando un objeto no tiene ninguna referencia que lo señale, el objeto se recoge y se recupera la memoria para la siguiente vez que el sistema ejecute el garbage collector .
Entonces aquellos que utilicen la clase Dictionary tienen dos opciones si quieren optimizar su aplicación, una es tratar las llaves como referencias débiles asignándole el parámetro booleano como true:
var composicion:Composicion = new Composicion("lorem ipsum...","Titulo 1");
var miDiccionario:Dictionary = new Dictionary(true);
miDiccionario[composicion] = grupoNoticia;
composicion = null; // ahora estara elegible para el recolector de basura.
o bien eliminar el objeto y también su referencia cuando lo creas oportuno.
//basandonos en mi ejemplo anterior
composicion1 = null;
delete miDiccionario[composicion1];
Octubre 6th, 2006 at 1:02 pm
[...] Sergio Alvarez As 3.0 (Detectar cursor fuera swf) As 3.0 (Cambiar fps dinámicamente) As 3.0 (Adiós al attachMovie) As 3.0 (Casting de objetos) As 3.0 (TimerEvent.TIMER) As 3.0 (flash.display.Sprite) As 3.0 (flash.utils.Dictionary) [...]
Octubre 17th, 2006 at 12:14 am
[...] As 3.0 (Detectar cursor fuera swf) As 3.0 (Cambiar fps dinámicamente) As 3.0 (Adiós al attachMovie) As 3.0 (Casting de objetos) As 3.0 (TimerEvent.TIMER) As 3.0 (flash.display.Sprite) As 3.0 (flash.utils.Dictionary) Suscripción RSS a los comentarios de la entrada. Envía tu comentario [...]