Необходимо сохранить массив объектов класса в контроллере представления.
-
16-09-2019 - |
Вопрос
Ребята, вопрос по айфону!У меня есть 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.При этом прироста производительности практически нет, и при копировании вы будете сжигать ресурсы процессора и памяти.