Cocoa 的 NSMutableArray 是稀疏的吗?



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

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

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

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

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

见https://github.com/LavaSlider/DSSparseArray

一个NSArray对象是静态的(或不可变的),在某种意义上,它必须在你创建它的那一刻被填充,要么通过使用- initwithobject, + arraywithobject,或者通过使用-initWithArray等已经存在的数组的内容。以后不能添加对象。

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

,

相关内容

  • 没有找到相关文章

最新更新