Wenn Sie sich fragen, warum Sie vielleicht verwirrt sind, möchte ich eine Erklärung hinzufügen, was das zweite Codebeispiel tatsächlich macht (und warum es nicht notwendig ist)).
Ich denke, Sie werden durch diese Linie verwirrt, weil diese Zeile oft als "Initializing Foo" beschrieben wird. Das ist ein bisschen irreführend. Dort werden technisch 2 verschiedene Entitäten geändert - das neue Objekt NSMutableDictionary
wird angelegt und der Variablen "foo" wird ihre Adresse zugewiesen.
Die Linie erstellt tatsächlich ein neues Objekt NSMutableDictionary
auf dem Heap (der dynamische Speicherbereich Ihrer Anwendung). Ich werde das "Wörterbuch 1" nennen. Damit dieses neue "Dictionary 1" -Objekt auf dem Heap gefunden werden kann, wird seine Speicheradresse in "foo" gespeichert. "foo" s Rolle ist, als ein Index zu handeln, so können wir "Wörterbuch 1" finden.
Während wir oft sagen: "foo ist ein Wörterbuch", das ist, weil wir faul sind - die Aussage ist technisch falsch. Richtig: "Es gibt ein Wörterbuch auf dem Heap und foo speichert seine Speicheradresse, so dass wir sie finden und benutzen können".
Wenn Sie führen Sie dann die Zeile:
foo = [bar mutableCopy];
Sie die Adresse in „bar“ werden mit einem anderen Objekt zu finden (ich nenne es „Dictionary 2“) in dem Haufen, und machen noch ein anderes Objekt ("Dictionary 3") auf dem Heap mit den gleichen Werten. Wenn Sie zählen, sind dies jetzt 3 Objekte.
Nachdem "Dictionary 3" erstellt wurde, wird seine Speicheradresse in der Variablen "foo" gespeichert. Diese Speicherung in "foo" überschreibt die vorhandene Speicheradresse (diejenige, die auf "Dictionary 1" zeigt). Dies bedeutet, dass wir keine verbleibenden Hinweise auf "Dictionary 1" haben und daher nie wieder finden können. Deshalb sagen wir "Wörterbuch 1" ist durchsickern.
Ich hoffe, Sie können aus dieser Situation sehen, warum "Dictionary 1" nie benötigt wurde (Sie wollten nur "foo" verwenden, um auf die Kopie zuzugreifen, "Dictionary 3").
Nicht freigeben. mutableCopy gibt ein automatisch freigegebenes Objekt zurück. – NilObject
aus der Dokumentation: Der Aufrufer der Methode ist jedoch verantwortlich für die Freigabe des zurückgegebenen Objekts. – cobbal
@NilObject: Nein, tut es nicht. Siehe http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html#//apple_ref/doc/uid/20000043-BEHDEDDB –