Cocoa的NSMutableArray稀疏吗?

时间:2011-07-11 08:22:29

标签: cocoa nsmutablearray sparse-array

如果我创建一个可能最多有2 ^ 16个元素的NSMutableArray,但是大部分都是空的,我会浪费空间还是将NSMutableArray实现为稀疏数组?

3 个答案:

答案 0 :(得分:8)

NSArray中的元素不能为空,并且没有“默认”值。要表示nil,您通常使用单例[NSNull null],它仍然是对象的引用,因此它消耗内存(指针)。我会考虑使用NSDictionary(或NSMutableDictionary)代替数字(NSNumber)。

答案 1 :(得分:1)

NSArrayNSMutableArray都不是稀疏数组。如果你有一个包含5000个条目的数组,除了4999之外的所有内容都设置为[NSNull null],它仍然占用5000个条目的空间。

同样,NSPointerArray将有5000个条目的空间,所有条目NULL除了索引4999。

我使用OMZ描述的NSMutableDictionary开发了一个稀疏数组对象。有了这个,一个条目只有 space 。但是,此空间同时包含索引和对象,并且存在将索引值转换为NSNumber的开销。因此,尽管可以在任何地方使用NSArrayNSMutableArray,但会有性能损失。这是经典的速度/空间权衡。

请参阅https://github.com/LavaSlider/DSSparseArray

答案 2 :(得分:-3)

NSArray对象是静态的(或不可变的),因为它必须在您创建它时填充,或者使用-initWithObjects,+ arrayWithObjects,或者使用已存在的数组的内容和-initWithArray,您以后不能添加对象。

有一个具体的可变子类(称为NSMutableArray),它允许根据需要动态添加和删除对象。但是当你在一个空状态(通过-initWithCapacity:或+ arrayWithCapacity :)初始化它时,你指定的是初始长度只是一个提示(创建的数组有足够的内存来容纳那么多的对象),它可以增加它必要时进行扩展。所以是的,在这种情况下,它将是一个稀疏数组。

最佳,