33

我正在使用一个数组来存储从我的 iPhone 应用程序中的数据库加载的缓存对象,并且想知道:使用 NSMutableArray 是否有任何我应该知道的重大缺点?

编辑:我知道 NSMutableArray 可以修改,但我正在寻找具体原因(性能等)为什么要使用 NSArray 。我认为会有性能差异,但我不知道它是否重要。

4

5 回答 5

50

如果您正在从数据库加载对象并且您确切地知道您有多少对象,那么您可能会从NSMutableArraysarrayWithCapacity:方法中获得最佳性能,并将对象添加到它直到满为止,因此它会立即分配所有内存。

在幕后,它们秘密地是同一件事 -NSArray并且NSMutableArrayCFArray通过免费桥接用 s 实现(aCFMutableArrayRef和 aCFArrayRef是同一事物的 typedef,__CFArray * *

NSArray并且NSMutableArray应该具有相同的性能/复杂性(访问时间最坏是 O(lg N),最好是 O(1)),唯一的区别是两个对象将使用多少内存 -NSArray有一个固定的限制,而NSMutableArray可以用完尽可能多的空间。

CFArray.h中的注释对此有更多详细信息。

*:正如 Catfish_Man 在下面指出的那样,这不再是真的了。

于 2009-11-17T03:15:52.680 回答
25

使用 NSArray 与 NSMutable 数组的性能差异主要出现在您使用要复制数组的 API 时。如果您将 -copy 发送到不可变数组,它只会增加保留计数,但将 -copy 发送到可变数组将分配堆内存。

于 2009-11-17T05:37:50.927 回答
14

此外, NSMutableArray 不是线程安全的,而 NSArray 是(与所有可变对象与“不可变”对象相同)。如果您使用多线程,这可能是一个大问题。

于 2009-11-17T13:36:25.437 回答
9

的主要缺点NSMutableArray是,NSMutableArray如果另一个对象也拥有它,则拥有 a 的对象可能会在其背后更改数组。这可能需要您对对象进行更防御性的编码,而不是过于激进地追求性能。

如果NSMutableArray没有暴露在对象之外,这不是问题。

NSArray是共享的更好选择,正是因为它是不可变的。每个使用它的对象都可以假设它不会改变,并且不需要防御性地复制它。

可能与复制其密钥而不是简单地保留它们的原因相同NSDictionary:它需要确保它们不会变异,而复制是保证这一点的唯一方法。

于 2010-10-12T22:15:31.300 回答
2

NSArray一旦创建就不能修改。如果您需要从数组中添加/删除对象,那么您将使用NSMutableArray- 没有太多选择。我假设NSArray针对固定数组操作进行了优化。可变数组提供了灵活的可修改性。

于 2009-11-17T02:28:11.703 回答