7

我有一个关于 NSArray 和 NSMutableArray 的问题。我理解两者之间的区别主要是 NSArray 是不可变的,而 NSMutableArray 是可变的。就我的研究而言,性能也是一样的。有一件事我找不到一个好的答案,那就是 NSMutableArray 是否使用比 NSArray 更多的内存,以及 NSMutableArray 在内存方面是否比 NSArray 更苛刻。

我非常感谢您的建议和解释。

谢谢维克

4

3 回答 3

13

NSMutableArray 使用更多的内存有两个(呃,四个,见评论)原因:

1)因为它可以改变大小,所以它不能存储对象内部的内容,必须存储一个指向outline storage的指针以及用于存储的额外malloc节点

2)因为在添加东西时一次调整一个元素的大小会很慢,它会以块的形式调整大小,这可能会导致一些未使用的空间。

于 2013-01-24T03:20:19.310 回答
2

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

于 2013-01-24T03:13:33.330 回答
1

对于正常使用,没有明显的性能差异。

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

在 DTCoreText 的某些情况下,我发现 [NSMutableArray 复制] 到 NSArray 将占用 Instruments 中方法时间的 40%。即返回可变数组将方法时间减半。

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

于 2013-01-24T06:25:46.540 回答