0

环顾了一会儿,找不到答案,但这似乎是一件很简单的事情。我想创建一个 NSArray,它有 100 个对象(门)的空间,然后循环遍历为数组中的每个索引创建一个新门。当我初始化 NSArray 时,如果不手动为 100 个新门编写代码,我就找不到办法做到这一点。我知道我可以通过创建一个 NSMutableArray 并使用 addObject 来做到这一点,但我听说 NSArrays 更快,我想知道如何做到这一点以供将来参考。

这就是我基本上想要做的事情:

NSArray *doors = [[NSArray alloc]init]; //with size 100?
for (int i = 0; i < [doors count]; i++)
    [[doors objectAtIndex:i] = [[Door alloc]init]];
4

4 回答 4

3

如果您要将对象添加到循环内的数组中,那么 NSMutableArray 是要使用的正确对象。

创建 100 个门:

NSMutableArray *doors = [NSMutableArray new];
for (int i=0; i < 100; i++){
    [doors addObject:[[Door alloc]init]];
}

现在你有一个包含 100 个门对象的可变数组。如果以后不需要修改数组,可以将其转换回不可变数组进行处理,如下所示:

NSArray *newDoorList = [NSArray arrayWithArray:doors];

可变数组和非可变数组之间可能存在一些较小的性能影响,但您不会注意到它们只有几百个对象 - 至少这是我的经验。

希望有帮助。祝你好运。

于 2012-11-24T01:15:00.733 回答
1

创建一个 NSMutableArray,然后使用 [array copy] 获取一个不可变的 NSArray。

于 2012-11-24T01:11:41.497 回答
1

有关某些选项,请参阅此答案,基本上是创建一个 NSMutable 数组并使用它来创建您的 NSArray ...

http://www.cocoabuilder.com/archive/cocoa/190315-nsmutablearray-to-nsarray.html#190321

于 2012-11-24T01:13:26.573 回答
1

NSMutableArray 是一个动态数组,不需要预先定义大小。正如 Aleph 建议的那样,使用 NSMutableArray 并将您的门对象附加 100 倍。像这样:

 NSMutableArray *myArray = [NSMutableArray arrayWithCapacity:100];

 for ( int i = 0; i < 100; i++ ) {

      [myArray addObject: [[Door alloc] init]];
 }

 NSArray *filledArray = [NSArray arrayWithArray:myArray];

刚刚编辑以包含 arrayWithCapacity: 方法。根据这个 SO 线程,如果您知道所需的确切 数字,它应该一次分配所有内存。除此之外, NSArray 与 NSMutableArray 在速度方面不会表现出太大的差异。(直到被证明是错误的。O_o)

使用 NSMutableArray 与 NSArray 的缺点?

于 2012-11-24T01:14:50.023 回答