如何动态填充NSArray?

15

我有一个for循环。在该循环内,我想用一些对象填充一个NSArray。但是我没有看到任何可以让我这样做的方法。我知道预先有多少对象。我想避免使用NSMutableArray,因为有些人告诉我与NSArray相比,那会带来很大的开销和性能瓶颈。

我有像这样的代码:

NSArray *returnArray = [[NSArray alloc] init];
for (imageName in imageArray) {
    UIImage *image = [UIImage imageNamed:imageName];
    //Now, here I'd like to add that image to the array...
}

我查看了NSArray的文档,但是如何指定要放多少个元素呢?或者我必须使用NSMutableArray吗?

我在文档中查找NSArray,但是怎样指定其中会有多少个元素呢?或者我真的必须使用NSMutableArray吗?


我现在没有时间查看,但也许你需要先创建一个NSMutableArray,然后使用其中的一个方法来获取不可变版本?不确定这是否只会给你一个不可变接口而没有速度提升(即它可能与可变版本具有相同的底层实现),但值得一看。据我所记,苹果文档对此并不清楚。 - frankodwyer
5
不要听那些告诉你某个东西性能不好的人!NSMutableArray是Objective-C的核心部分,它经过高度优化,没有理由避免使用它! - Jakob Egger
4个回答

27

是的,你需要使用一个NSMutableArray

int count = [imageArray count];
NSMutableArray *returnArray = [[NSMutableArray alloc] initWithCapacity:count];
for (imageName in imageArray) {
    UIImage *image = [UIImage imageNamed:imageName];
    [returnArray addObject: image];
    ...
}

编辑 - 修正了声明


谢谢。您确定变量的数据结构是NSArray类型,而不是NSMutableArray吗?或者它们是可以互换的吗? - Thanks
NSMutableArray是NSArray的子类,所以它是安全的。 - Alnitak
是的,我忘了。谢谢!这引发了另一个问题 ;) - Thanks
由于它被用作可变数组,returnArray应声明为NSMutableArray。尽管该代码能正常运行,因为对象确实是可变类型,但这是个不好的做法(并且会产生一个关于NSArray无法响应addObject:方法的警告)。 - smorgan
所以如果那是不好的做法,当然我会这样做NSMutableArray *returnArray = [[NSMutableArray alloc] initWithCapacity:count]; ;) - Thanks

4

对于这个问题,你需要使用NSMutableArray,因为添加操作是可变的,而NSArray是不可变的。

你可以在之后将填充好的NSMutableArray转换成NSArray点击此处查看讨论),但是你不能很快地向普通的NSArray中添加项目。


3

这是使用 NSMutableArray 的好时机吗?

我知道你提到想要避免它,但有时候会有使用它的原因。


2
我建议只有在您知道 NSMutableArray 确实会影响性能时才进行优化,但如果确实会影响性能,您可以在填充后从可变数组创建一个静态数组。这取决于性能问题是否由您随后使用 NSMutableArray 引起,还是仅由创建它引起。
我猜这不会成为您的应用程序性能瓶颈。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接