使用NSMutableArray和NSArray的缺点?

时间:2009-11-17 02:22:03

标签: iphone cocoa cocoa-touch nsmutablearray nsarray

我正在使用一个数组存储从我的iPhone应用程序中的数据库加载的缓存对象,并且想知道:使用我应该知道的NSMutableArray有什么明显的缺点吗?

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

5 个答案:

答案 0 :(得分:49)

如果您正在从数据库加载对象并且您知道完全您有多少个对象,那么您可能会从NSMutableArray arrayWithCapacity:方法获得最佳性能,并向其添加对象直到满,所以如果可以,它会立即分配所有内存。

在幕后,他们秘密地做同样的事情 - NSArrayNSMutableArray都是通过免费桥接CFArray实现的CFMutableArrayRefCFArrayRef是同一个类型的typedef,__CFArray * *

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

CFArray.h中的评论有更详细的内容。

*:正如Catfish_Man在下面指出的那样,现在不再适用了。

答案 1 :(得分:25)

使用NSArray与NSMutable数组的性能差异主要出现在使用想要复制数组的API时。如果你发送-copy到一个不可变数组,它只是颠覆了保留计数,但是发送-copy到一个可变数组会分配堆内存。

答案 2 :(得分:14)

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

答案 3 :(得分:9)

NSMutableArray的主要缺点是,如果另一个对象也拥有它,那么拥有NSMutableArray的对象可能会在其后面更改数组。这可能要求您在防御性方面对对象进行编码,而不是积极地追逐性能。

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

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

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

答案 4 :(得分:2)

创建后,您无法修改NSArray。如果您需要在阵列中添加/删除对象,那么您将使用NSMutableArray - 没有太多选项。我假设NSArray针对固定阵列操作进行了优化。可变阵列灵活地提供可修改的功能。