如果我创建一个NSMutableArray,可能有多达2^16个元素,但将主要是空的,我会浪费空间还是NSMutableArray作为一个稀疏数组实现?
NSArray
中的元素不能为空,并且没有"默认"值。为了表示nil
,您通常使用单例[NSNull null]
,它仍然是对对象的引用,因此它消耗内存(指针)。我会考虑使用NSDictionary
(或NSMutableDictionary
)与数字(NSNumber
)键代替。
否,NSArray
和NSMutableArray
都不是稀疏数组。如果你有一个5000个条目的数组,除了4999之外的所有内容都设置为[NSNull null]
,它仍然占用5000个条目的空间。
同样,NSPointerArray
将有5000个条目的空间,除了索引4999,所有条目都是NULL
。
我使用OMZ描述的NSMutableDictionary
开发了一个稀疏数组对象。这样,只有空间用于一个条目。然而,这个空间同时保存索引和对象,并且存在将索引值转换为NSNumber
s的开销。因此,尽管它们可以在NSArray
或NSMutableArray
可以使用的任何地方使用,但会有性能损失。这是一个典型的速度/空间权衡。
见https://github.com/LavaSlider/DSSparseArray
一个NSArray对象是静态的(或不可变的),在某种意义上,它必须在你创建它的那一刻被填充,要么通过使用- initwithobject, + arraywithobject,或者通过使用-initWithArray等已经存在的数组的内容。以后不能添加对象。
有一个具体的可变子类(称为NSMutableArray),它允许根据需要动态地添加和删除对象。然而,当您在空状态下初始化它时(通过-initWithCapacity:或+arrayWithCapacity:),您指定的初始长度只是一个提示(数组创建时具有足够的内存来容纳该数量的对象),但是它可以根据需要进行扩展。在这个例子中,它将是一个稀疏数组
,