Pregunta

Un iPhone pregunta para ustedes! Tengo una NSURLConnection que descarga XML de un servidor y lo procesa en una matriz que es una parte de otra matriz. No tengo forma de saber cuántos objetos que necesitaré, así que no puedo asignar una NSArray de antemano. Mi pregunta es:

¿Sería mejor para crear la matriz como una matriz NSArray a nivel de clase y asignarlo después de almacenar los datos en un NSMutableArray temporal o simplemente hacer el NSMutableArray a nivel de clase? Vale la pena señalar que no es necesario modificar la matriz que no sea para liberarlo al final de la ejecución del programa.

¿Fue útil?

Solución

No creo que lo que realmente importa.

Estoy leyendo el libro Principio iPhone 3 Desarrollo en este momento, y por lo general la carga de los datos se realiza de esta manera: Usted tendría una propiedad NSArray:

@interface
{
...
    NSArray *listOfObjects;
...
}
@property (nonatomic, retain) NSArray *listObObjects;
...

A continuación, se crea un NSMutableArray, cargar sus datos y establece la propiedad:

NSMutableArray *array = [[NSMutableArray alloc] init]; // ?
// load the XML into array here
...
self.listOfObjects = array;
[array release];

listOfObjects entonces serían tratados como un NSArray (inmutable) a pesar de que en realidad sería una NSMutableArray.

Otros consejos

Creo que lo que es probable que desee hacer es crear algunas clases que coincidan con lo que se está representando en su XML. Por ejemplo, si XML es como la siguiente:

<peopleList>
  <person>
    <name>Joe</name>
    <possession>Shovel</possession>
  </person>
  <person>
    <name>Sam</name>
    <possession>Shovel</possession>
    <possession>Fork</possession>
    <possession>Backpack</possession>
  </person>
</peopleList>

Usted debe tener una clase PeopleList y una clase de persona. Un objeto instancia de la clase PeopleList tiene su primera matriz que contiene uno o más objetos persona. Los objetos Persona, a su vez, también tienen matrices para mantener las posesiones (que en este caso son cadenas - aunque si es necesario que podrían ser objetos de Posesión) En este caso, para ayudar al ejemplo de la clase de persona también tiene otra propiedad: 'nombre' que es también una cadena.

Por ejemplo:

@interface PeopleList {
    NSMutableArray *persons;  // An array to store the Person objects
}
@property (nonatomic, retain) NSMutableArray *persons;    
@end



@interface Person {
    NSString *name;  
    NSMutableArray *possesions; //An array to store this Person's possesion strings
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSMutableArray *possesions;
@end

En el método init de uno de estos objetos que tendrá que alloc / init las matrices por lo que estarán listos para recibir objetos. Y porque los alloc'd, mi clase es responsable de la liberación.

@implementation PeopleList
    -(id) init {
        if (self = [super init]) {
             persons = [[NSMutableArray alloc] init];
        }
    }

    -(void) dealloc {
       [persons release];
       [super dealloc];
    }
@end


@implementation PeopleList
    -(id) init {
        if (self = [super init]) {
             possesions = [[NSMutableArray alloc] init];
        }
    }

    -(void) dealloc {
       [possesions release];
       [super dealloc];
    }
@end

Ahora que esto se hace, se puede configurar la estructura de datos de la matriz de conexión en cascada. Como se está analizando el XML cuando se encuentra una etiqueta PeopleList hacer:

currentPeopleList = [[PeopleList alloc] init];

y cuando te encuentras con una persona a hacer un taje:

currentPerson = [[Person alloc] init];
[peopleList.persons addObject: person];

una posesión:

[currentPerson.possesion addObject: contentsOfCurrentElement];

o nombre:

currentPerson.name = contentsOfCurrentElement;

Pero para responder a su pregunta más específica, no almacenar los datos en un NSArray temporal y luego copia que en un NSMutableArray. No hay casi ninguna mejora del rendimiento al hacerlo, y usted va a quemar los ciclos de CPU y memoria haciendo la copia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top