2009-12-31 18 views
18

Actualmente estoy haciendo lo siguiente para limpiar un NSMutableDictionary¿Cómo borrar un diccionario?

[myDictionary release]; 
myDictionary = [[NSMutableDictionary alloc] init]; 

La línea de liberación en realidad no libere a todos los objetos en el diccionario. Aún puedo verlos a todos en la siguiente línea. No es hasta que se ejecuta la línea de asignación que el diccionario se pone a cero. Hay una mejor manera de hacerlo?

Respuesta

32
+0

Tiene usted razón. Por alguna razón, no apareció en la sugerencia del código cuando lo intenté inicialmente ... así que supuse que no estaba disponible. Ya lo veo. Gracias. – 4thSpace

+5

Esto no responde la pregunta. '-release' en el diccionario liberará todos los objetos contenidos. 4thSpace tiene un problema diferente. – bbum

+0

Solo quiero hacerme eco de que si liberas un NSDictionary y los objetos no se lanzan, significa que esos objetos tienen un valor de retención de más de uno, lo que significa que están siendo retenidos o no se están liberando correctamente en otro lugar. Cuando agrega los objetos al diccionario, ¿los está liberando (o soltándolos) correctamente? – lucius

6

-removeAllObjects funcionará, como Andy mencionó. Sin embargo, si alguno de los objetos de su diccionario se libera automáticamente, o si el diccionario se ha liberado automáticamente en algún punto de la línea, no se destrabarán hasta la próxima vez que finalice el recorrido (cuando se vacíe el conjunto de autorrelease) .

30

Usted dice:

línea de la liberación no realmente liberación ningún objeto en el diccionario. Todavía puedo verlos todos en la siguiente línea . No es hasta que se ejecuta la línea alloc que el diccionario se pone a cero. ¿Hay una manera mejor de hacerlo? ?

Si -release del diccionario mutable hace que el diccionario para cancelar la asignación - gotas de la cuenta de retención a cero - a continuación, el diccionario mutable dará a conocer todos contenían objetos. Siempre.

Por lo tanto, si los objetos no están siendo liberados, entonces esto sugiere "solución" ...

[myDictionary removeAllObjects]; 
[myDictionary release]; 
myDictionary = [[NSMutableDictionary alloc] init]; 

... es una fuga de memoria en que la instancia original de NSMutableDictionary se filtró.

Como resultado, llamando -removeAllObjects se vacía el diccionario y liberar todos los objetos que contiene, , pero todavía tiene una pérdida de memoria que se debe averiguar y corregir.


Para ser franco:

Si los objetos en su diccionario no se cancela la asignación cuando se recibe el diccionario lo anterior -release (sin llamar -removeAllObjects), entonces no es una pérdida de memoria. Es bien:

  1. Los objetos en el diccionario han sido retenidos un tiempo extra.

  2. Todavía hay un destacado -retain en el diccionario.

Dado que usted dice los objetos están siendo correctamente (como en, como era de esperar) desasignado cuando llame -removeAllObjects, entonces debe ser (2). Mire a través de su código y descubra dónde hay un -retain extra del diccionario. Puede utilizar el instrumento Object Alloc para averiguar exactamente de dónde provienen todas las reservas.

+0

-removeAllObjects funciona sin llamar -release. ¿Estás diciendo que sigue siendo una pérdida de memoria? – 4thSpace

+0

Sí. El diccionario se está filtrando. – bbum

2
[aMutableDictionary removeAllObjects]; 

de Apple's documentation:

(void)removeAllObjects

Descripción - Vacía el diccionario de sus entradas. Cada clave y el objeto de valor correspondiente se envía un mensaje de liberación.

disponibilidad - IOS (2.0 y posteriores)