出于内存原因,NSMutableArray比NSArray更好吗?

时间:2013-01-24 03:11:12

标签: ios objective-c memory-management nsmutablearray nsarray

我对NSArray和NSMutableArray有疑问。我理解两者之间的区别主要是NSArray是不可变的,NSMutableArray是可变的。就我的研究而言,性能也是一样的。有一件事我找不到一个好的答案,那就是NSMutableArray使用的内存比NSArray多,如果NSMutableArray在某种程度上比NSArray更苛刻。

我真的很感激这些建议和解释。

由于 维克

3 个答案:

答案 0 :(得分:13)

NSMutableArray为两个(呃,四个,请参阅注释)使用稍多的内存:

1)因为它可以改变大小,它不能将内容存储在对象内部,并且必须存储指向外部存储的指针以及存储的额外malloc节点

2)因为在添加内容时一次调整一个元素的速度非常慢,所以它会以块的形式调整大小,这可能会导致一些未使用的空间。

答案 1 :(得分:2)

这就像想知道标准数组或std::vector之间的区别。可变数据结构确实需要做更多的事情,而不是主要内存(因为NSMutableArrayNSArray所需的内容可能相同)但它需要动态调整大小并管理所有特定操作,如插入和不可变数组不必要的删除:当分配对象时,维度是不变的。

答案 2 :(得分:1)

正常使用时没有明显的性能差异。

但是,如果从内部使用可变数组构建响应的方法返回NSArray,那么我发现临时数组的副本可能会花费大量时间。

在DTCoreText的某些情况下,我发现NSArray的[NSMutableArray副本]占用了仪器中40%的方法时间。即返回可变数组会减少方法时间。

因此,在评估NSArray与可变性能时,我建议您将注意力转向避免复制对象。在紧密循环或内部方法中,您应该优先避免复制。