如果我创建一个 NSMutableArray 最多可能有 2^16 个元素,但大部分都是空的,我会浪费空间还是将 NSMutableArray 实现为稀疏数组?
3 回答
an 中的元素NSArray
不能为空,并且没有“默认”值。要表示nil
,您通常会使用 singleton [NSNull null]
,它仍然是对对象的引用,因此它会消耗内存(指针)。我会考虑将NSDictionary
(or NSMutableDictionary
) 与数字 ( NSNumber
) 键一起使用。
不,NSArray
也不NSMutableArray
是稀疏数组。如果您有一个包含 5000 个条目的数组,除了 4999 之外的所有内容都设置为[NSNull null]
它仍然占用 5000 个条目的空间。
同样,anNSPointerArray
将拥有 5000 个条目的空间,其中NULL
除了索引 4999 之外的所有条目。
NSMutableDictionary
我使用OMZ 描述的一个稀疏数组对象。有了这个,只有一个条目的空间。然而,这个空间同时保存了索引和对象,并且存在将索引值转换为NSNumber
s 的开销。因此,尽管它们可以在任何地方使用,NSArray
或者NSMutableArray
可能存在性能损失。这是经典的速度/空间权衡。
NSArray 对象是静态的(或不可变的),因为它必须在您创建它的那一刻被填充,可以通过使用 -initWithObjects、+arrayWithObjects 或通过使用带有 -initWithArray 的现有数组的内容等。你以后无法添加对象。
有一个具体的可变子类(称为 NSMutableArray),它允许根据需要动态添加和删除对象。但是,当您将其初始化为空状态(通过 -initWithCapacity: 或 +arrayWithCapacity:) 时,您指定的初始长度只是一个提示(创建的数组具有足够的内存来容纳该数量的对象),但是它可以根据需要进行扩展。所以是的,在这种情况下,它将是一个稀疏数组。
最好的,