在 NSArray 中设置值

Posted

技术标签:

【中文标题】在 NSArray 中设置值【英文标题】:Setting Values in NSArray 【发布时间】:2012-11-24 01:06:39 【问题描述】:

环顾了一会儿,找不到答案,但这似乎是一件很简单的事情。我想创建一个可容纳 100 个对象(门)的 NSArray,然后循环遍历为数组中的每个索引创建一个新门。当我初始化 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]];

【问题讨论】:

许多 Cocoa 类都有可变和不可变的形式——NSString、NSArray、NSDictionary 等。当您查看NSString 的文档时,您将在第二段中看到可变形式的提及,以及对其描述的“热链接”。这就是隐藏所有“好东西”的地方。 (但是,在查看可变描述时,您还需要回溯到非可变形式来查找,例如,rangeOfString 或其他一些查询类型函数。) 【参考方案1】:

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

创建 100 扇门:

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

现在您有了一个包含 100 个门对象的可变数组。 如果以后不需要修改数组,可以将其转换回 一个用于处理的不可变数组:

NSArray *newDoorList = [NSArray arrayWithArray:doors];

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

希望对您有所帮助。祝你好运。

【讨论】:

谢谢!是的,我不担心这个特定实现的性能,但我很好奇,我想我应该找出如何为更大的未来项目做这件事。 欢迎您。我经常使用可变数组只是因为它们的语法使它们更容易读写。我通常会将它们转换为普通的 NSArray,如果我以 segue 或类似的方式将它们发送到线上,并且该数组正在成为共享数据源,否则它并不是什么大问题。核心开发者可能会争论这一点,如果您在团队中开发,请记住这一点 - 这可能是其中一位开发者的烦恼。祝你好运。【参考方案2】:

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

【讨论】:

【参考方案3】:

查看这个答案以获得一些选项,基本上是创建一个 NSMutable 数组并使用它来创建您的 NSArray...

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

【讨论】:

【参考方案4】:

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 线程,如果您知道所需的 exact 数字,它应该一次分配所有内存。除此之外, NSArray 与 NSMutableArray 在速度方面不会表现出太大的差异。 (直到被证明是错误的。O_o)

Disadvantage of using NSMutableArray vs NSArray?

【讨论】:

以上是关于在 NSArray 中设置值的主要内容,如果未能解决你的问题,请参考以下文章

如何对 NSArray 中的数字进行排序?

NSArray 中的 iOS sdk NSArray 查找和合并

在 Objective-C 中将 NSArray 过滤成一个新的 NSArray

从 NSArray 获取单个属性的 NSArray

NSArray 方法 算法逻辑

nsarray 中的 NSLog nsarray