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