你们的iPhone问题!我有一个NSURLConnection,它从服务器下载XML并将其处理成一个数组,该数组是另一个数组的一部分。我无法知道我需要多少个物体,所以我不能事先分配一个NSArray。我的问题是:
在类级别创建父数组作为NSArray并在将数据存储在临时NSMutableArray中之后分配它还是仅在类级别创建NSMutableArray会更好吗?值得注意的是,我不需要修改数组,除了在程序运行结束时释放它。
答案 0 :(得分:1)
我认为这不重要。
我正在阅读Beginning 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。
答案 1 :(得分:0)
我认为您可能想要做的是创建一些与您在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 Class也有另一个属性:'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 tage时,请执行以下操作:
currentPerson = [[Person alloc] init];
[peopleList.persons addObject: person];
a possesion:
[currentPerson.possesion addObject: contentsOfCurrentElement];
或姓名:
currentPerson.name = contentsOfCurrentElement;
但是为了回答您更具体的问题,我不会将数据存储在临时NSArray中,然后将其复制到NSMutableArray中。这样做几乎没有性能提升,你将烧掉cpu周期和内存进行复制。