Необходимо сохранить массив объектов класса в контроллере представления.

StackOverflow https://stackoverflow.com/questions/1141119

Вопрос

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

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

Это было полезно?

Решение

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

Сейчас я читаю книгу «Начало разработки 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.

Другие советы

Я думаю, что вы, вероятно, захотите создать несколько классов, соответствующих тому, что вы представляете в своем 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 также имеет другое свойство:«имя», которое также является строкой.

Например:

@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

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

@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];

и когда вы встретите страницу Person, сделайте следующее:

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

владение:

[currentPerson.possesion addObject: contentsOfCurrentElement];

или имя:

currentPerson.name = contentsOfCurrentElement;

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top