我有一个关于NSArray和NSMutableArray的问题。我主要了解两者之间的区别,即NSArray是不可变的,而NSMutableArray是可变的。据我的研究,它们的性能基本相同。有一件事我找不到好的答案,那就是NSMutableArray是否比NSArray使用更多的内存,并且是否对内存更加苛刻。
我真的很感谢您的建议和解释。
谢谢 Vik
我真的很感谢您的建议和解释。
谢谢 Vik
NSMutableArray使用略多一些内存的原因有两个(嗯,四个,请参见注释):
1) 由于它可以更改大小,因此不能将内容存储在对象内部,必须存储指向存储器外线的指针以及用于存储的额外malloc节点。
2) 因为如果每次添加元素时都调整大小,速度会非常慢,所以它会分块调整大小,这可能导致一些未使用的空间。
这就像在思考标准数组和std::vector
之间的区别。可变数据结构需要做更多的事情,不仅仅是内存(NSMutableArray
和NSArray
所需的内存可能相等),而且需要动态调整大小并管理所有特定操作,例如插入和删除,这些操作在不可变数组中是不必要的:数组的尺寸在对象分配时确定且保持不变。
对于普通使用,没有明显的性能差异。
然而,如果您从一个使用可变数组构建响应的方法中返回NSArray,则我发现临时数组的副本可能需要较长时间。
在DTCoreText中的某些情况下,我发现[NSMutableArray copy]到NSArray会占用Instruments中40%的方法时间。也就是说,返回可变数组将减少方法时间一半。
因此,在评估NSArray与可变性能时,我建议您注意避免复制对象。在紧密循环或内部方法中,您应该优先避免复制。
NSArray
的实例发送一个copy
消息时,它会返回self
而不是创建一个新实例。这可能会节省一些内存消耗和对象分配/释放。 - jlehr