2010-01-25 14 views
5

Apple ha fornito questo esempio:Perché devo creare una copia mutabile di questo array?

NSError *error; 
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
if (mutableFetchResults == nil) { 
    // Handle the error 
} 

Perché sono chiamando mutableCopy qui? È perché volevano avere un NSMutableArray piuttosto che un NSArray, per modificarlo/modificarlo in seguito? O c'è un'altra ragione?

+1

Difficile rispondere senza visualizzare il resto del codice. Hai provato a cercare altre linee che usano mutableFetchResults? – ewall

risposta

6

La risposta può essere trovata più in alto nel article che ha fornito il tuo esempio:

Quando il controller della vista tabella carica la sua vista, si dovrebbe andare a prendere gli oggetti evento e tenerli nella matrice eventi in modo che possano essere visualizzati più tardi. L'array di eventi deve essere disattivabile poiché l'utente può aggiungere e rimuovere eventi.

Il blocco di codice nell'esempio è una parte di un processo in più parti di recupero di oggetti gestiti da un archivio permanente. Il prossimo passo nel processo chiamerà setEventsArray:, che richiede un array mutabile.

+0

"Il prossimo passo nel processo chiamerà' setEventsArray: ', che richiede un array mutabile." Il che fa schifo: tutto ciò che ottiene 'eventsArray' può mutarlo senza la conoscenza del suo proprietario. Il modo sicuro per fare cose è che la proprietà dell'array sia pubblicamente immutabile, con gli accessor della classe che sono l'unico modo per mutare l'array. Questa copia è necessaria (spostandola in 'setEventsArray:' non sarebbe più lenta), e quella nel getter (per restituire una copia immutabile dell'array mutabile) può essere tagliata se tale ottimizzazione è veramente giustificata. –

0

È difficile dire perché lo hanno fatto senza vedere l'esempio. L'unica ragione per farlo sarebbe quella di creare una copia dell'array che è possibile modificare. Ma, se il tuo intento è solo quello di leggere gli elementi recuperati, allora non c'è bisogno di fare una copia, mutevole o altro.

2

Questo codice di esempio deriva probabilmente da "Core Data Tutorial per iPhone" dei documenti Apple. Se è così, il motivo per cui hanno fatto mutableCopy è che hanno bisogno di NSMutableArray per ivar che è definito come NSMutableArray.

Il codice di esempio imposta mutableFetchResults alla variabile di istanza come nel modo seguente.

[self setEventsArray:mutableFetchResults]; 
[mutableFetchResults release]; 
[request release]; 

Quindi, la variabile di istanza è definita come segue.

@interface RootViewController : UITableViewController <CLLocationManagerDelegate> { 

    NSMutableArray *eventsArray; 
    NSManagedObjectContext *managedObjectContext; 

    CLLocationManager *locationManager; 
    UIBarButtonItem *addButton; 
} 
3

Se ricordo che l'uso corretto di [myObject copy] crea una copia immutabile dell'oggetto per impostazione predefinita, quindi se NSMutableArray diventa NSArray.

Perché in questo esempio si desidera mantenere la mutabilità, e quindi la capacità di manipolare, la matrice che si chiama [myObject mutableCopy]; per garantire di ottenere una copia mutabile dell'oggetto.

Problemi correlati