Нужно хранить массив массивов объектов класса в View Controller - PullRequest
0 голосов
/ 17 июля 2009

Вопрос iPhone для вас, ребята! У меня есть NSURLConnection, который загружает XML с сервера и обрабатывает его в массив, который является частью другого массива. У меня нет возможности узнать, сколько объектов мне понадобится, поэтому я не могу выделить NSArray заранее. Мой вопрос:

Было бы лучше создать родительский массив как NSArray на уровне класса и выделить его после того, как я сохраню данные во временном NSMutableArray или просто создаю NSMutableArray на уровне класса? Стоит отметить, что мне не нужно изменять массив, кроме как освобождать его в конце выполнения программы.

Ответы [ 2 ]

1 голос
/ 17 июля 2009

Не думаю, что это действительно имеет значение.

В данный момент я читаю книгу «Начало разработки для iPhone 3», и обычно загрузка данных выполняется следующим образом: У вас есть свойство NSArray:

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

Затем вы создаете NSMutableArray, загружаете ваши данные и устанавливаете свойство:

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

listOfObjects тогда будет обрабатываться как NSArray (неизменяемый), хотя на самом деле это NSMutableArray

0 голосов
/ 17 июля 2009

Я думаю, что вы, вероятно, хотите сделать, это создать несколько классов, которые соответствуют тому, что вы представляете в своем XML. Например, если ваш XML выглядит примерно так:

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

У вас должен быть класс PeopleList и класс Person. Объект, созданный из класса PeopleList, имеет ваш первый массив, который содержит один или несколько объектов Person. Объекты Person, в свою очередь, также имеют массивы для хранения положений (которые в данном случае являются строками - хотя при необходимости они могут быть объектами Possesion). В этом случае, чтобы помочь примеру, у класса Person также есть другое свойство: 'name' который также является строкой.

Например:

@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

В методе init этих объектов вам нужно будет распределить / инициализировать массивы, чтобы они были готовы к приему объектов. И поскольку я их выделил, мой класс отвечает за выпуск.

@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

Теперь, когда это сделано, вы можете настроить структуру данных каскадных массивов. Когда вы анализируете XML, когда сталкиваетесь с тегом PeopleList, выполните:

currentPeopleList = [[PeopleList alloc] init];

и когда вы встречаете персонажа, сделайте:

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

Владение:

[currentPerson.possesion addObject: contentsOfCurrentElement];

или имя:

currentPerson.name = contentsOfCurrentElement;

Но чтобы ответить на ваш более конкретный вопрос, я не храню данные во временном NSArray, а затем копирую их в NSMutableArray. При этом почти нет выигрыша в производительности, и вы будете записывать циклы ЦП и память при копировании.

...