【问题标题】:Is NSMutableArray better than NSArray for memory reasons?出于内存原因,NSMutableArray 是否比 NSArray 更好?
【发布时间】:2013-01-24 03:11:12
【问题描述】:

我有一个关于 NSArray 和 NSMutableArray 的问题。我理解两者之间的区别主要是 NSArray 是不可变的,而 NSMutableArray 是可变的。就我的研究而言,性能也差不多。有一件事我找不到一个好的答案,那就是 NSMutableArray 是否使用比 NSArray 更多的内存,以及 NSMutableArray 在内存方面是否比 NSArray 更苛刻。

非常感谢您的建议和解释。

谢谢 维克

【问题讨论】:

    标签: ios objective-c memory-management nsmutablearray nsarray


    【解决方案1】:

    NSMutableArray 使用更多的内存有两个(呃,四个,参见 cmets)原因:

    1) 因为它可以改变大小,所以它不能将内容存储在对象内部,必须存储一个指向 out-line storage 的指针以及用于存储的额外 malloc 节点

    2) 因为在添加东西时一次调整一个元素的大小会很慢,所以它会以块的形式调整大小,这可能会导致一些未使用的空间。

    【讨论】:

    • 和 3) 因为当您向NSArray 的实例发送copy 消息时,它返回self 而不是实际创建一个新实例。这可能会节省一些内存消耗和/或对象分配/释放。
    • 啊,是的,好电话。另外 4) 它必须单独跟踪容量和计数,因为 2.
    【解决方案2】:

    这就像想知道标准数组和std::vector 之间的区别。可变数据结构确实需要做更多的事情,而不是主要是内存(NSMutableArrayNSArray 需要的可能是相等的),但它需要动态调整大小并管理所有特定操作,如插入和删除不可变数组不需要:维度是在分配对象时决定的,它是常量。

    【讨论】:

      【解决方案3】:

      正常使用没有明显的性能差异。

      但是,如果您从内部使用可变数组构建响应的方法返回 NSArray,那么我发现临时数组的副本可能需要大量时间。

      在 DTCoreText 中的某些情况下,我发现 [NSMutableArray 复制] 到 NSArray 会占用 Instruments 中方法时间的 40%。 IE。返回可变数组使方法时间减半。

      因此,在评估 NSArray 与可变性能时,我建议您将注意力集中在避免复制对象上。在紧密循环或内部方法中,您应该避免复制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多