Indovinando il motivo per cui potresti essere confuso, vorrei aggiungere una spiegazione di ciò che effettivamente fa il secondo codice (e perché non è necessario).
NSMutableDictionary *foo = [[NSMutableDictionary alloc] initWithCapacity:0];
Penso che si sta ottenendo confuso da questa linea, perché questa linea è spesso descritto come "foo inizializzazione". Questo è un po 'fuorviante. Ci sono tecnicamente 2 entità diverse che vengono modificate qui: il nuovo oggetto NSMutableDictionary
viene creato e alla variabile "foo" viene assegnato il suo indirizzo.
La linea crea effettivamente un nuovo oggetto NSMutableDictionary
nello heap (area di memoria dinamica dell'applicazione). Chiamerò questo "Dizionario 1". In modo che questo nuovo oggetto "Dizionario 1" sull'heap possa essere trovato, il suo indirizzo di memoria è memorizzato in "pippo". Il ruolo di "foo" è quello di agire come un indice, quindi possiamo trovare "Dizionario 1".
Mentre spesso diciamo: "foo is a dictionary", perché siamo pigri, l'affermazione è tecnicamente sbagliata. Correttamente: "c'è un dizionario sull'heap e foo memorizza il suo indirizzo di memoria in modo che possiamo trovarlo e usarlo".
Quando si esegue quindi la linea:
foo = [bar mutableCopy];
si sta utilizzando l'indirizzo in "bar" per trovare un oggetto diverso (lo chiamerò "Dizionario 2") nel mucchio, e fare ancora un un altro oggetto ("Dizionario 3") sull'heap con gli stessi valori. Se stai mantenendo il conto, questo è ora 3 oggetti esistenti.
Dopo aver creato "Dizionario 3", il suo indirizzo di memoria viene quindi memorizzato nella variabile "foo". Questa memorizzazione in "pippo" sovrascrive l'indirizzo di memoria esistente (quello che indicava "Dizionario 1"). Ciò significa che non abbiamo puntatori rimanenti per "Dizionario 1" e quindi non sarà mai in grado di trovarlo di nuovo. Questo è il motivo per cui diciamo che "Dizionario 1" è trapelato.
Spero che tu possa vedere da questa situazione perché "Dizionario 1" non è mai stato necessario (hai sempre pensato di utilizzare "foo" per accedere alla copia, "Dizionario 3").
fonte
2009-03-23 00:16:02
Non rilasciarlo. mutableCopy restituisce un oggetto autoreleased. – NilObject
dalla documentazione: l'invocatore del metodo, tuttavia, è responsabile del rilascio dell'oggetto restituito. – cobbal
@NilObject: No, non è così. Vedi http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html#//apple_ref/doc/uid/20000043-BEHDEDDB –