Adivinando por qué podría estar confundido, me gustaría agregar una explicación de lo que realmente hace el segundo código (y por qué no es necesario)
NSMutableDictionary *foo = [[NSMutableDictionary alloc] initWithCapacity:0];
Creo que se confunde con esta línea porque esta línea a menudo se describe como "inicializar foo". Eso es un poco engañoso. Aquí se modifican técnicamente 2 entidades diferentes: se crea el nuevo objeto NSMutableDictionary
y se asigna a la variable "foo" su dirección.
La línea en realidad crea un nuevo objeto NSMutableDictionary
en el montón (el área de memoria dinámica de su aplicación). Llamaré a este "Diccionario 1". Para que se pueda encontrar este nuevo objeto "Diccionario 1" en el montón, su dirección de memoria se almacena en "foo". El rol de "foo" es actuar como un índice, por lo que podemos encontrar el "Diccionario 1".
Mientras solemos decir: "foo es un diccionario", eso es porque somos flojos: la afirmación es técnicamente incorrecta. Correctamente: "hay un diccionario en el montón y foo almacena su dirección de memoria para que podamos encontrarlo y usarlo".
Cuando a continuación, ejecuta la línea:
foo = [bar mutableCopy];
está utilizando la dirección en la "barra" para encontrar un objeto diferente (lo llamaré "Diccionario 2") en el montón, y hacer aún otro objeto ("Diccionario 3") en el montón con los mismos valores. Si mantienes la cuenta, ahora hay 3 objetos en existencia.
Después de realizar "Diccionario 3", su dirección de memoria se almacena en la variable "foo". Este almacenamiento en "foo" sobrescribe la dirección de memoria existente (la que apuntaba a "Diccionario 1"). Esto significa que no tenemos punteros restantes para "Diccionario 1" y, por lo tanto, nunca podremos encontrarlo nuevamente. Es por eso que decimos que el "Diccionario 1" se ha filtrado.
Espero que pueda ver en esta situación por qué nunca se necesitó el "Diccionario 1" (solo se pretendía usar "foo" para acceder a la copia, "Diccionario 3").
No lo suelte. mutableCopy devuelve un objeto liberado automáticamente. – NilObject
de la documentación: el invocador del método, sin embargo, es responsable de liberar el objeto devuelto. – cobbal
@NilObject: No, no es así. Consulte http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html#//apple_ref/doc/uid/20000043-BEHDEDDB –