2013-06-12 15 views
10

che è considerato il modo migliore per ricavare un nuovo dizionario da un originale:NSDictionary + dictionaryWithDictionary o -copy?

[NSDictionary dictionaryWithDictionary:otherDictionary]; 

o

[otherDictionary copy]; 

?

Di tanto in tanto abbiamo bisogno di creare un dizionario mutevole da un immutabile, e così questa domanda continua ad arrivare. Forse non c'è nessuno, ma sono curioso di vedere se in alcuni casi d'uso uno è meglio di l'altro.

EDIT: Io conosco i metodi di cui sopra non possono essere utilizzati per ricavare una mutabile dizionario . Volevo solo fare la domanda in modo generale e poi spiegare come affronto questa domanda da un giorno all'altro. Avrei dovuto essere più chiaro a riguardo.

risposta

27

In realtà, essi sono diversi, ma non per il motivo che ci si aspetta. Presumo che tu stia usando ARC (e se non lo sei, perché no?), Quindi l'auto-releaseness dell'oggetto restituito non ha importanza.

Ecco come si differenziano: considerare cosa succede se otherDictionary è nil.

Beh, se si utilizza:

[otherDictionary copy]; // or -mutableCopy 

Otterrai nil, perché si dispone di un ricevitore nil.

D'altra parte, se si utilizza:

[NS(Mutable)Dictionary dictionaryWithDictionary:otherDictionary]; 

È volontà tornare un NS(Mutable)Dictionary, indipendentemente dal fatto che otherDictionary è nil o meno.

Questo è bello nella situazione in cui è necessario creare una copia di un dizionario e vuole fare un esempio NSDictionary seguito, ma non si vuole mettere alla prova per nil (yay per ridurre la complessità ciclomatica!).

+2

Cioè, signore, una cattura molto buona. E, per indicare una ragione pratica per la scelta dell'uno sull'altro, devi ottenere il segno di spunta. – matehat

+1

Le intestazioni iOS 9.0 contrassegnano l'argomento per 'dictionaryWithDictionary:' as (implicitamente) '_Nullull'. Si tratta solo di una svista o Apple sta dicendo che il comportamento passato con argomenti 'nil' non dovrebbe essere invocato? –

0

Il modo di cacao-approvato è quello di inviare un metodo mutableCopy che restituisce una copia mutabile:

NSMutableDictionary *mutableOtherDictionaryCopy = [otherDictionary mutableCopy] 
3

Sono semanticamente equivalenti. Quale da usare è interamente una questione di scelta. Sono a favore dello -copy, solo perché è più corto e rende più chiaro ciò che sta accadendo.

Se è necessaria una copia mutabile (come indica il testo), le righe che hai inviato non funzionano. Hai bisogno di:

[NSMutableDictionary dictionaryWithDictionary:otherDictionary]; 

o, equivalentemente:

[otherDictionary mutableCopy]; 

In termini di gestione della memoria, -copy e -mutableCopy, restituire un oggetto con un +1 mantenere conteggio, il che significa è necessario rilasciare loro quando si' fatto con loro. -dictionaryWithDictionary: restituisce un oggetto autoreleased, quindi non è necessario rilasciarlo quando hai finito, e devi mantenerlo se vuoi tenerlo in giro. Nei giorni precedenti (pre-ARC), questa distinzione ha significato che l'approccio utilizzato potrebbe dipendere dalle esigenze di gestione della memoria (sono comunque intercambiabili dopo un ulteriore mantenimento o rilascio, ovviamente). Ovviamente, se stai usando ARC, questa distinzione non conta per te.

+0

Sì, grazie, appena preso (e modificato la mia risposta). –

+0

Sì, uso sempre 'mutableCopy' (perché altrimenti non funzionerebbe, come dici tu). Volevo solo formulare la domanda in un modo generale, non specificamente per la derivazione mutabile. – matehat

7

Ci sono un paio di cose su questa domanda:

In primo luogo, questi due sono leggermente diversi:

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

# 1 restituisce un oggetto autoreleased (cioè, uno con un +0 mantengono conteggio); # 2 restituisce un oggetto con un conteggio di mantenimento +1, quindi il chiamante è responsabile della chiamata a release ad un certo punto.

(sono anche un po 'diverso se otherDictionary è nil: # 1 restituisce un dizionario vuoto, mentre # 2 ritorni nil.)

Naturalmente, nella sua interrogazione, in realtà chiedere di mutevoli copie.Nota puoi eseguire una di queste operazioni:

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

Gli stessi avvertimenti di cui sopra si applicano a ciascuno di questi metodi.

Probabilmente non c'è un modo migliore per sé, ma mutableCopy è la più chiara (basta ricordare che si deve rilasciare l'oggetto mantenuto a un certo punto).

+0

Ottima risposta. Quindi, con ARC la scelta è interamente una questione di gusto. – matehat

+0

Buona risposta, ma non sono proprio la stessa cosa. Le differenze sorgono se 'otherDictionary' è' nil'. –

+0

@DaveDeLong: Ho preso nota nella mia risposta. – mipadi