我正在使用一个数组来存储从我的 iPhone 应用程序中的数据库加载的缓存对象,并且想知道:使用 NSMutableArray 是否有任何我应该知道的重大缺点?
编辑:我知道 NSMutableArray 可以修改,但我正在寻找具体原因(性能等)为什么要使用 NSArray 。我认为会有性能差异,但我不知道它是否重要。
我正在使用一个数组来存储从我的 iPhone 应用程序中的数据库加载的缓存对象,并且想知道:使用 NSMutableArray 是否有任何我应该知道的重大缺点?
编辑:我知道 NSMutableArray 可以修改,但我正在寻找具体原因(性能等)为什么要使用 NSArray 。我认为会有性能差异,但我不知道它是否重要。
如果您正在从数据库加载对象并且您确切地知道您有多少对象,那么您可能会从NSMutableArray
sarrayWithCapacity:
方法中获得最佳性能,并将对象添加到它直到满为止,因此它会立即分配所有内存。
在幕后,它们秘密地是同一件事 - *NSArray
并且NSMutableArray
都CFArray
通过免费桥接用 s 实现(aCFMutableArrayRef
和 aCFArrayRef
是同一事物的 typedef,__CFArray *
)
NSArray
并且NSMutableArray
应该具有相同的性能/复杂性(访问时间最坏是 O(lg N),最好是 O(1)),唯一的区别是两个对象将使用多少内存 -NSArray
有一个固定的限制,而NSMutableArray
可以用完尽可能多的空间。
CFArray.h中的注释对此有更多详细信息。
*:正如 Catfish_Man 在下面指出的那样,这不再是真的了。
使用 NSArray 与 NSMutable 数组的性能差异主要出现在您使用要复制数组的 API 时。如果您将 -copy 发送到不可变数组,它只会增加保留计数,但将 -copy 发送到可变数组将分配堆内存。
此外, NSMutableArray 不是线程安全的,而 NSArray 是(与所有可变对象与“不可变”对象相同)。如果您使用多线程,这可能是一个大问题。
的主要缺点NSMutableArray
是,NSMutableArray
如果另一个对象也拥有它,则拥有 a 的对象可能会在其背后更改数组。这可能需要您对对象进行更防御性的编码,而不是过于激进地追求性能。
如果NSMutableArray
没有暴露在对象之外,这不是问题。
NSArray
是共享的更好选择,正是因为它是不可变的。每个使用它的对象都可以假设它不会改变,并且不需要防御性地复制它。
这可能与复制其密钥而不是简单地保留它们的原因相同NSDictionary
:它需要确保它们不会变异,而复制是保证这一点的唯一方法。
NSArray
一旦创建就不能修改。如果您需要从数组中添加/删除对象,那么您将使用NSMutableArray
- 没有太多选择。我假设NSArray
针对固定数组操作进行了优化。可变数组提供了灵活的可修改性。