繁体   English   中英

使用NSMutableArray与NSArray的劣势?

[英]Disadvantage of using NSMutableArray vs NSArray?

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

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

如果要从数据库加载对象,并且确切知道多少个对象,则可能会从NSMutableArrayarrayWithCapacity:方法中获得最佳性能,并向其中添加对象直到满,因此,如果它可以。

在幕后,他们是偷偷同样的事情- NSArrayNSMutableArray都与实施CFArray s可通过免费电话进行桥接(一CFMutableArrayRefCFArrayRef是类型定义是一样的东西, __CFArray * )*

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

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

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

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

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

NSMutableArray的主要缺点是,拥有NSMutableArray的对象可能在另一个对象也拥有的情况下更改了数组。 这可能需要您更防御性地编码对象,而不太积极地追求性能。

如果NSMutableArray没有暴露在对象外部,则不必担心。

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

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

创建NSArray后,您将无法对其进行修改。 如果您需要从数组中添加/删除对象,则可以使用NSMutableArray没有太多选择。 我假设NSArray针对固定数组操作进行了优化。 可变数组提供了可修改的灵活性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM