[英]Disadvantage of using NSMutableArray vs NSArray?
我正在使用数组存储从iPhone应用程序中的数据库加载的缓存对象,并且想知道:使用NSMutableArray是否有我应该知道的明显缺点?
编辑:我知道NSMutableArray可以修改,但我正在寻找特定的原因(性能等。)为什么人们会改用NSArray。 我认为会有性能上的差异,但是我不知道它是否重要。
如果要从数据库加载对象,并且确切知道有多少个对象,则可能会从NSMutableArray
的arrayWithCapacity:
方法中获得最佳性能,并向其中添加对象直到满,因此,如果它可以。
在幕后,他们是偷偷同样的事情- NSArray
和NSMutableArray
都与实施CFArray
s可通过免费电话进行桥接(一CFMutableArrayRef
和CFArrayRef
是类型定义是一样的东西, __CFArray *
)*
NSArray
和NSMutableArray
应该具有相同的性能/复杂度(访问时间最差为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.