【问题标题】:Disadvantage of using NSMutableArray vs NSArray?使用 NSMutableArray 与 NSArray 的缺点?
【发布时间】:2009-11-17 02:22:02
【问题描述】:

我正在使用一个数组来存储从我的 iPhone 应用程序中的数据库加载的缓存对象,我想知道:使用 NSMutableArray 是否有任何我应该知道的重大缺点?

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

【问题讨论】:

    标签: iphone cocoa cocoa-touch nsmutablearray nsarray


    【解决方案1】:

    如果您正在从数据库加载对象并且您确切地知道您有多少对象,您可能会从NSMutableArrays arrayWithCapacity: 方法获得最佳性能,并将对象添加到直到满,所以如果可以的话,它会一次分配所有的内存。

    在幕后,它们实际上是相同的 - NSArrayNSMutableArray 都通过免费桥接与 CFArrays 实现(CFMutableArrayRefCFArrayRef 是 typedef 的同样的事情,__CFArray *) *

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

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

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

    【讨论】:

    • 请注意,NSArray 不再根据 CFArray 实现(尽管写此答案时是四年前)
    • 您在哪里阅读过关于目标 C 中数据结构性能的信息?
    • @George Objective-C 中数据结构的性能与其他语言几乎相同。如果您想了解基金会的具体细节,ridiculousfish.com/blog/posts/array.html 有一些见解,尽管在过去十年中具体细节发生了变化。
    【解决方案2】:

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

    【讨论】:

    • 增加保留计数要快得多。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      NSMutableArray 的主要缺点是拥有NSMutableArray 的对象可能会在另一个对象也拥有它的情况下更改其背后的数组。这可能需要您对对象进行更具防御性的编码,而不是过于激进地追求性能。

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

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-17
          相关资源
          最近更新 更多