在 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 中的 iOS sdk NSArray 查找和合并