2010-01-25 12 views
5

de Apple proporciona este ejemplo:¿Por qué debo hacer una copia mutable de esta matriz?

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

Por qué están llamando mutableCopy aquí? ¿Es porque querían tener un NSMutableArray en lugar de un NSArray, para editarlo/cambiarlo más tarde? ¿O hay otra razón?

+1

Es difícil de responder sin ver el resto del código. ¿Intentó buscar otras líneas que usan mutableFetchResults? – ewall

Respuesta

6

La respuesta se puede encontrar más arriba en el article que proporcionó el ejemplo:

Cuando el controlador de vista de tabla carga su punto de vista, se debe descargar los objetos de eventos y mantenerlos en la matriz de eventos para que puedan mostrarse más tarde. La matriz de eventos debe ser mutable, ya que el usuario puede agregar y eliminar eventos.

El bloque de código en su ejemplo es una parte de un proceso de partes múltiples de obtención de objetos administrados desde una tienda persistente. El siguiente paso en el proceso llamará al setEventsArray:, que requiere una matriz mutable.

+0

"El siguiente paso en el proceso llamará a' setEventsArray: ', que requiere una matriz mutable." Lo que apesta: cualquier cosa que obtenga 'eventsArray' puede mutar sin el conocimiento del propietario. La forma más segura de hacer las cosas es que la propiedad de la matriz sea públicamente inmutable, con los descriptores de acceso de la clase como la única manera de modificar la matriz. Esta copia es necesaria (moverla a 'setEventsArray:' no sería más lenta), y la del getter (para devolver una copia inmutable de la matriz mutable) puede cortarse si tal optimización realmente está garantizada. –

0

Es difícil decir por qué lo hicieron sin ver el ejemplo. La única razón para hacerlo sería hacer una copia de la matriz que puede modificar. Pero, si su intención es solo leer los elementos obtenidos, entonces no hay necesidad de hacer una copia, mutable o no.

2

Este código de ejemplo probablemente proviene de "Core Data Tutorial for iPhone" de los documentos de Apple. Si es así, la razón por la que lo hicieron mutableCopy es que necesitan NSMutableArray para el ivar que se define como NSMutableArray.

El código de ejemplo establece mutableFetchResults en la variable de instancia de la siguiente manera.

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

Luego, la variable de instancia se define de la siguiente manera.

@interface RootViewController : UITableViewController <CLLocationManagerDelegate> { 

    NSMutableArray *eventsArray; 
    NSManagedObjectContext *managedObjectContext; 

    CLLocationManager *locationManager; 
    UIBarButtonItem *addButton; 
} 
3

Si recuerdo correctamente usando [myObject copy] crea una copia inmutable del objeto por defecto, por lo que si tiene NSMutableArray se convierte en NSArray.

Porque en este ejemplo desea mantener la mutabilidad, y por lo tanto la capacidad de manipular, la matriz que llama [myObject mutableCopy]; para asegurarse de obtener una copia mutable del objeto.

Cuestiones relacionadas