我有一个关于 NSArray 和 NSMutableArray 的问题。我理解两者之间的区别主要是 NSArray 是不可变的,而 NSMutableArray 是可变的。就我的研究而言,性能也是一样的。有一件事我找不到一个好的答案,那就是 NSMutableArray 是否使用比 NSArray 更多的内存,以及 NSMutableArray 在内存方面是否比 NSArray 更苛刻。
我非常感谢您的建议和解释。
谢谢维克
我有一个关于 NSArray 和 NSMutableArray 的问题。我理解两者之间的区别主要是 NSArray 是不可变的,而 NSMutableArray 是可变的。就我的研究而言,性能也是一样的。有一件事我找不到一个好的答案,那就是 NSMutableArray 是否使用比 NSArray 更多的内存,以及 NSMutableArray 在内存方面是否比 NSArray 更苛刻。
我非常感谢您的建议和解释。
谢谢维克
NSMutableArray 使用更多的内存有两个(呃,四个,见评论)原因:
1)因为它可以改变大小,所以它不能存储对象内部的内容,必须存储一个指向outline storage的指针以及用于存储的额外malloc节点
2)因为在添加东西时一次调整一个元素的大小会很慢,它会以块的形式调整大小,这可能会导致一些未使用的空间。
这就像想知道标准数组或std::vector
. 可变数据结构确实需要做更多的事情,主要不是内存(因为它需要NSMutableArray
并且NSArray
可能相等),但它需要动态调整大小并管理所有特定操作,如插入和删除,这对于不可变数组是不必要的:维度是在分配对象时决定的,它是恒定的。
对于正常使用,没有明显的性能差异。
但是,如果您从内部使用可变数组来构建响应的方法返回 NSArray,那么我发现临时数组的副本可能需要大量时间。
在 DTCoreText 的某些情况下,我发现 [NSMutableArray 复制] 到 NSArray 将占用 Instruments 中方法时间的 40%。即返回可变数组将方法时间减半。
因此,在评估 NSArray 与可变性能时,我建议您将注意力集中在避免复制对象上。在紧密循环或内部方法中,您应该更喜欢避免复制。