Pregunta

[He leído el manual de Lua, pero no proporcionó respuestas sólidas.]

Digamos que tengo una tabla Lua, que actúa como una matriz indexada:

local myArray = {};
myArray[1] = "Foo";
myArray[2] = "Bar";

¿Cómo puedo deshacerme de esta tabla? ¿Acabo de configurar myArray en nil? ¿O tengo que iterar a través de la matriz y establecer cada elemento indexado en cero?

De manera similar, digamos que tengo una tabla Lua, que actúa como un diccionario:

local myDictionary = {};
myDictionary["key1"] = "Foo";
myDictionary["key2"] = "Bar";

¿Puedo establecer 'myDictionary' en nil, o tengo que iterar?

Por último, ¿qué hago, con respecto a la gestión de la memoria, donde tengo tablas anidadas? por ejemplo

local myNestedCollection = {};
myNestedCollection[1] = {1, 2, 3};
myNestedCollection[2] = {4, 5, 6};

¿Necesito iterar a través de cada una de estas sub-tablas, estableciéndolas en nulas? Gracias por cualquier ayuda.

¿Fue útil?

Solución

En la mayoría de los GC, un objeto se recopilará cuando no haya referencias a él. Establecer la parte superior de su cadena de referencia en nil elimina una referencia a los hijos. Si esa era la única referencia, los niños serán recogidos.

Otros consejos

Debería ser suficiente simplemente para establecer la variable local en nil ; no es necesario recorrer todas las claves y establecerlas en nil para. De acuerdo con esta página , Lua usa un algoritmo de recolección de basura de marca y barrido. Tan pronto como configura su variable local en nil , las claves en su tabla se vuelven inalcanzables, de modo que el recolector de basura las recolectará en la próxima colección. De manera similar, si esos objetos también son tablas, sus claves también serán inalcanzables, por lo que también serán recolectadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top