NSMutableArray如何更改使用removeObjectAtIndex的对象索引?

时间:2014-06-11 23:09:18

标签: ios objective-c nsarray

使用NSMutableArray时,我可以addObject:然后使用removeObjectAtIndex:0删除前面的对象。来自文档:

  

为了填补空白,索引之外的所有元素都会通过从索引中减去1来移动。

这意味着,索引2处的对象变为1,3变为2,等等。这是否意味着每个对象都被移动到索引1或者是"索引"值更新为index-1,0位置为空。

我意识到后者听起来有多愚蠢,但是这一行让我觉得这就是发生的事情。

2 个答案:

答案 0 :(得分:3)

与大多数数组实现一样,NSMutableArray可能知道它所存储的对象的大小以及它所存储的对象的总数。有了这些知识,它就可以合理地使用指针数学来访问感兴趣的对象。但是,如果您真的对理解NSMutableArray的工作原理感兴趣,我建议您检查CFArray,它是NSMutableArray的CoreFoundation变体。您可以在此处查看开源代码:

http://www.opensource.apple.com/source/CF/CF-476.14/CFArray.c

答案 1 :(得分:1)

关于你的实际问题,不,数组中永远不会有间隙。 NSArray s无法保留nil个值。与NSPointerArray进行比较和对比。

Re:你的标题,内存的实际分配和释放是一个不透明的实现细节,数组可能使用任何类型的内部存储--C数组,链表,任何东西。 This article(提供链接,这就是为什么我认为当其他人已经通过评论回答问题时这个值得回答的原因)会看一下NSArray的性能特征并提出一个非平凡的方法正在内部使用,因为性能根据枚举的类型而有所不同。