0

一个iPhone问题给你们!我有一个 NSURLConnection 从服务器下载 XML 并将其处理成一个数组,该数组是另一个数组的一部分。我无法知道我需要多少个对象,所以我不能事先分配一个 NSArray。我的问题是:

将父数组创建为类级别的 NSArray 并在我将数据存储在临时 NSMutableArray 中之后分配它,或者只是在类级别创建 NSMutableArray 会更好吗?值得注意的是,除了在程序运行结束时释放它之外,我不需要修改数组。

4

2 回答 2

1

我不认为这真的很重要。

我现在正在阅读《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。

于 2009-07-17T02:59:13.723 回答
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 类还具有另一个属性:'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 周期和内存。

于 2009-07-17T05:49:45.187 回答