2013-06-12 14 views
10

Welches ist der bessere Weg ist als ein neues Wörterbuch von einem Original ableiten:NSDictionary + dictionaryWithDictionary oder -copy?

[NSDictionary dictionaryWithDictionary:otherDictionary]; 

oder

[otherDictionary copy]; 

?

Von Zeit zu Zeit müssen wir ein veränderbares Wörterbuch aus einem unveränderlichen machen, und so kommt diese Frage immer wieder herein. Vielleicht gibt es keine, aber ich bin gespannt, ob in manchen Anwendungsfällen einer besser ist als das andere.

EDIT: Ich weiß es die oben genannten Methoden können keine wandelbar Wörterbuch abzuleiten verwendet werden. Ich wollte die Frage nur allgemein stellen und dann erklären, wie ich mich dieser Frage von Tag zu Tag stelle. Ich hätte das deutlicher machen sollen.

Antwort

27

Eigentlich sind sie sind anders, aber nicht aus dem Grund, den Sie erwarten. Ich gehe davon aus, dass Sie ARC verwenden (und wenn nicht, warum nicht?), So spielt die automatische Freigabe des zurückgegebenen Objekts keine Rolle.

So unterscheiden sie sich: Überlegen Sie, was passiert, wenn otherDictionarynil ist.

Nun, wenn Sie verwenden:

[otherDictionary copy]; // or -mutableCopy 

Sie werden zurück nil bekommen, weil Sie einen nil Empfänger haben.

Auf der anderen Seite, wenn Sie verwenden:

[NS(Mutable)Dictionary dictionaryWithDictionary:otherDictionary]; 

Sie wird erhalten eine NS(Mutable)Dictionary zurück, unabhängig davon, ob otherDictionary ist nil oder nicht.

Das ist schön in der Situation, wo Sie eine Kopie eines Wörterbuchs und wollen eine NSDictionary Instanz danach, erstellen müssen, aber Sie wollen nicht für nil testen (zur Reduzierung zyklomatische Komplexität yay!).

+2

Das ist, Sir, ein sehr guter Fang. Und um einen praktischen Grund für die Auswahl eines anderen zu nennen, sollten Sie ein Häkchen bekommen. – matehat

+1

Die iOS 9.0-Header markieren das Argument für 'dictionaryWithDictionary:' als (implizit) '_Nonnull'. Ist das nur ein Versehen oder sagt Apple, dass man sich nicht auf das vergangene Verhalten mit "null" Argumenten verlassen sollte? –

0

Die Cocoa-zugelassene Art und Weise ist eine mutableCopy Methode zu senden, die eine veränderbare Kopie zurückgibt:

NSMutableDictionary *mutableOtherDictionaryCopy = [otherDictionary mutableCopy] 
3

Sie sind semantisch äquivalent. Welcher zu verwenden ist, ist eine Frage der Wahl. Ich bevorzuge -copy, nur weil es kürzer ist und macht, was klar ist.

Wenn Sie eine veränderbare Kopie benötigen (wie Ihr Text angibt), funktionieren die von Ihnen geposteten Zeilen nicht. Sie benötigen:

[NSMutableDictionary dictionaryWithDictionary:otherDictionary]; 

oder äquivalent:

[otherDictionary mutableCopy]; 

In Bezug auf die Speicherverwaltung, -copy und -mutableCopy, kehren ein Objekt mit einem +1 Zahl behalten, was bedeutet, Sie müssen sie freizugeben, wenn Sie‘ Re mit ihnen gemacht. -dictionaryWithDictionary: gibt ein automatisch freigegebenes Objekt zurück, so dass Sie es nicht freigeben müssen, wenn Sie damit fertig sind, und es beibehalten müssen, wenn Sie es beibehalten möchten. In den alten (vor ARC) Tagen bedeutete diese Unterscheidung, dass der von Ihnen verwendete Ansatz von Ihren Anforderungen an die Speicherverwaltung abhängen könnte (sie sind natürlich nach einem zusätzlichen Retain oder Release noch austauschbar). Wenn Sie ARC verwenden, spielt diese Unterscheidung natürlich keine Rolle.

+0

Ja, danke, habe gerade das (und bearbeitete meine Antwort). –

+0

Ja, ich benutze immer 'mutableCopy' (weil es sonst nicht funktionieren würde, wie du sagst). Ich wollte die Frage nur allgemein formulieren, nicht spezifisch für die veränderbare Ableitung. – matehat

7

Es gibt ein paar Dinge, über diese Frage:

Zum einen sind diese beiden etwas anders:

[NSDictionary dictionaryWithDictionary:otherDictionary]; #1 
[otherDictionary copy];          #2 

# 1 kehrt ein Autoreleased Objekt (das heißt, eine mit einem 0 Beibehaltungszähler); # 2 gibt ein Objekt mit einer +1 Anzahl zurück, so dass der Aufrufer für den Aufruf von release an einem bestimmten Punkt verantwortlich ist.

(Sie sind auch etwas anders, wenn otherDictionary ist nil: # 1 kehrt ein leeres Wörterbuch, während # 2 kehrt nil.)

Natürlich in Ihrer Frage, die Sie tatsächlich über wandelbar Kopien fragen.Beachten Sie, dass Sie eine der folgenden Möglichkeiten nutzen können:

[NSMutableDictionary dictionaryWithDictionary:otherDictionary]; 
[otherDictionary mutableCopy]; 

Für jede dieser Methoden gelten dieselben Vorbehalte wie oben.

Es gibt wahrscheinlich keine besten Weise per se, aber mutableCopy ist die klar (nur nicht vergessen, dass Sie das beibehalten Objekt an einem bestimmten Punkt zu lösen haben).

+0

Große Antwort. Bei ARC ist die Wahl also ausschließlich eine Frage des Geschmacks. – matehat

+0

Gute Antwort, aber sie sind nicht ganz gleich. Unterschiede ergeben sich, wenn "otherDictionary" "nil" ist. –

+0

@DaveDeLong: Eine Notiz in meiner Antwort gemacht. – mipadi

Verwandte Themen