使用NSMutableArray和NSArray的缺点?

igu*_*222 33 iphone cocoa cocoa-touch nsmutablearray nsarray

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

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

zad*_*adr 50

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

在幕后,它们是秘密相同的东西 - NSArray并且NSMutableArray都是CFArray通过免费桥接实现的(a CFMutableArrayRef和a CFArrayRef是同一类型的typedef __CFArray *)*

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

CFArray.h中的注释更详细.

*:正如Catfish_Man指出的那样,这不再适用.

  • 请注意,NSArray不再以CFArray的形式实现(尽管是在四年前编写此答案时) (4认同)

NSR*_*der 25

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

  • 将保留计数提高速度要快得多. (2认同)

Mat*_*ick 14

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


Ste*_*her 9

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

如果NSMutableArray没有暴露在物体外面,这不是一个问题.

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

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