NSMutableArray在内存方面是否比NSArray更好?

7
我有一个关于NSArray和NSMutableArray的问题。我主要了解两者之间的区别,即NSArray是不可变的,而NSMutableArray是可变的。据我的研究,它们的性能基本相同。有一件事我找不到好的答案,那就是NSMutableArray是否比NSArray使用更多的内存,并且是否对内存更加苛刻。
我真的很感谢您的建议和解释。
谢谢 Vik
3个回答

13

NSMutableArray使用略多一些内存的原因有两个(嗯,四个,请参见注释):

1) 由于它可以更改大小,因此不能将内容存储在对象内部,必须存储指向存储器外线的指针以及用于存储的额外malloc节点。

2) 因为如果每次添加元素时都调整大小,速度会非常慢,所以它会分块调整大小,这可能导致一些未使用的空间。


3
第三点是因为当您向 NSArray 的实例发送一个 copy 消息时,它会返回 self 而不是创建一个新实例。这可能会节省一些内存消耗和对象分配/释放。 - jlehr
2
啊,没错,说得好。另外第四点是,由于第二点的原因,它必须分别跟踪容量和数量。 - Catfish_Man

2

这就像在思考标准数组和std::vector之间的区别。可变数据结构需要做更多的事情,不仅仅是内存(NSMutableArrayNSArray所需的内存可能相等),而且需要动态调整大小并管理所有特定操作,例如插入和删除,这些操作在不可变数组中是不必要的:数组的尺寸在对象分配时确定且保持不变。


1

对于普通使用,没有明显的性能差异。

然而,如果您从一个使用可变数组构建响应的方法中返回NSArray,则我发现临时数组的副本可能需要较长时间。

在DTCoreText中的某些情况下,我发现[NSMutableArray copy]到NSArray会占用Instruments中40%的方法时间。也就是说,返回可变数组将减少方法时间一半。

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


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