一个iPhone问题给你们!我有一个 NSURLConnection 从服务器下载 XML 并将其处理成一个数组,该数组是另一个数组的一部分。我无法知道我需要多少个对象,所以我不能事先分配一个 NSArray。我的问题是:
将父数组创建为类级别的 NSArray 并在我将数据存储在临时 NSMutableArray 中之后分配它,或者只是在类级别创建 NSMutableArray 会更好吗?值得注意的是,除了在程序运行结束时释放它之外,我不需要修改数组。
一个iPhone问题给你们!我有一个 NSURLConnection 从服务器下载 XML 并将其处理成一个数组,该数组是另一个数组的一部分。我无法知道我需要多少个对象,所以我不能事先分配一个 NSArray。我的问题是:
将父数组创建为类级别的 NSArray 并在我将数据存储在临时 NSMutableArray 中之后分配它,或者只是在类级别创建 NSMutableArray 会更好吗?值得注意的是,除了在程序运行结束时释放它之外,我不需要修改数组。
我不认为这真的很重要。
我现在正在阅读《Beginning iPhone 3 Development》一书,通常加载数据是这样完成的:你有一个 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 对象也具有保存 possesions 的数组(在这种情况下是字符串 - 尽管如果需要它们可以是 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
现在完成了,您可以设置级联数组的数据结构。当您遇到 PeopleList 标签时正在解析 XML,请执行以下操作:
currentPeopleList = [[PeopleList alloc] init];
当你遇到 Person 标签时,请执行以下操作:
currentPerson = [[Person alloc] init];
[peopleList.persons addObject: person];
占有:
[currentPerson.possesion addObject: contentsOfCurrentElement];
或名称:
currentPerson.name = contentsOfCurrentElement;
但要回答您更具体的问题,我不会将数据存储在临时 NSArray 中,然后将其复制到 NSMutableArray 中。这样做几乎没有性能提升,而且你会在复制时消耗 CPU 周期和内存。