需要在View Controller中存储类对象数组的数组

时间:2009-07-17 01:47:46

标签: iphone objective-c nsmutablearray nsarray

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

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

2 个答案:

答案 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周期和内存进行复制。