1

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

4

3 回答 3

8

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

于 2011-07-11T08:36:38.933 回答
1

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

同样,anNSPointerArray将拥有 5000 个条目的空间,其中NULL除了索引 4999 之外的所有条目。

NSMutableDictionary我使用OMZ 描述的一个稀疏数组对象。有了这个,只有一个条目的空间。然而,这个空间同时保存了索引和对象,并且存在将索引值转换为NSNumbers 的开销。因此,尽管它们可以在任何地方使用,NSArray或者NSMutableArray可能存在性能损失。这是经典的速度/空间权衡。

https://github.com/LavaSlider/DSSparseArray

于 2014-05-26T17:48:16.597 回答
-3

NSArray 对象是静态的(或不可变的),因为它必须在您创建它的那一刻被填充,可以通过使用 -initWithObjects、+arrayWithObjects 或通过使用带有 -initWithArray 的现有数组的内容等。你以后无法添加对象。

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

最好的,

于 2011-07-11T08:29:53.203 回答