2009-07-11 4 views
2

Noch lernen Objective-C/iPhone SDK hier. Ich denke, ich weiß, warum das nicht funktionierte, aber ich wollte es nur bestätigen.Unterschied zwischen [[NSMutableDictionary alloc] initWithObjects: ...] und [NSMutableDictionary dictionaryWithObjects: ...]?

In awakeFromNib, wenn ich [[NSMutableDictionary alloc] initWithObjects:...] es ordnet tatsächlich (iPhone) Systemspeicher mit diesen NSMutableDictionary Daten, aber wenn ich [NSMutableDictionary dictionaryWithObjects:...] es verwende, ist nur in dem Stapel rechts zur Verfügung? Wenn ich beispielsweise in Zukunft versuche, über einen Knopfdruck über IBAction auf myMutableDict zuzugreifen, könnte das Objekt myMutableDict freigegeben worden sein, was zum Absturz meiner App geführt hat, obwohl ich es in meiner .h-Datei so definiert habe und synthetisiert es:

@property (nonatomic, retain) NSMutableDictionary *myMutableDict; 

Aus irgendeinem Grund zu [[NSMutableDictionary alloc] initWithObjects:...] Wechsel fixiert diese.

Antwort

15

+dictionaryWithObjects: gibt ein Autoreleased Wörterbuch
-initWithObjects: Sie müssen sich lösen

, wenn Sie das Wörterbuch wollen als Instanzvariable beharren, können Sie es mit einem init-Methode erstellen soll oder eine Autoreleased Version behalten, so oder so sollten Sie Stellen Sie sicher, es in Ihrer Dealloc-Methode zu veröffentlichen

Eine hervorragende Ressource zu diesem Thema ist die Memory Management Programming Guide for Cocoa.

+1

also grundsätzlich jedes Mal, wenn Sie ein Objekt für die Verwendung in Ihrem gesamten Projekt oder was auch immer synthetisieren, zum Beispiel würden Sie immer initWithDictionary verwenden wollen, damit es nicht zufällig auf Sie freigegeben wird, richtig? – taber

+0

richtig, oder [[NSMutableDictionary dictionaryWithObjects ...] behalten] ist gleich – cobbal

+0

ok klingt gut, danke! – taber

3

Um auf die andere Antwort zu erweitern, gibt es ein paar subtile Dinge, die Sie vermissen.

Zum einen gibt es in Objective-C keine Stapelobjekte. Alle Objekte leben auf dem Haufen, und die eine Form ist, wie erwähnt, "autoreleased".

Wahrscheinlich setzen Sie auch Ihre Instanzvariable direkt und umgehen damit die Speicherverwaltung von Ihrem Accessor und Mutator. Statt dessen:

myMutableDict = [NSMutableDictionary dictionaryWithObjects:...]; 

sollten Sie wahrscheinlich

self.myMutableDict = [NSMutableDictionary dictionaryWithObjects:...]; 

sagen oder sonst müssen Sie manuell die behalten oder entfernen Sie den Autofreigabe hinzufügen, wie Sie entdeckt haben.

Lesen Sie erneut die Anleitung zur Speicherverwaltung. Es erklärt das alles ausführlich.

+0

reicht, danke! – taber

+0

das habe ich übrigens auf jeden Fall gemacht. Hoppla. Danke noch einmal. – taber

Verwandte Themen