Objective c 为什么一旦我';你给它添加了更多的对象吗?

Objective c 为什么一旦我';你给它添加了更多的对象吗?,objective-c,ios,Objective C,Ios,发生了一些非常奇怪的事情。我按如下方式填充数组: self.workingWithItemCollectionArray = [NSMutableArray arrayWithCapacity:self.itemCollectionArray.count]; self.workingWithItemCollectionArray = [[self.itemCollectionArray mutableCopy]autorelease]; 它获取原始NSArray的可变副本,并将其传递给NSMu

发生了一些非常奇怪的事情。我按如下方式填充数组:

self.workingWithItemCollectionArray = [NSMutableArray arrayWithCapacity:self.itemCollectionArray.count];
self.workingWithItemCollectionArray = [[self.itemCollectionArray mutableCopy]autorelease];
它获取原始
NSArray
的可变副本,并将其传递给
NSMutableArray
。单击
ui按钮
访问此数组中包含的信息时,检索信息时会有轻微延迟

但当我更改原始数组以添加更多项,然后将其传递到可变数组时:

NSMutableArray *editedOriginalArray = [NSMutableArray arrayWithArray:self.itemCollectionArray];
[editedOriginalArray addObjectsFromArray:extraObjectsToAdd];
self.itemCollectionArray = [NSArray arrayWithArray:editedOriginalArray];

self.workingWithItemCollectionArray = [NSMutableArray arrayWithCapacity:self.itemCollectionArray.count];
self.workingWithItemCollectionArray = [[self.itemCollectionArray mutableCopy]autorelease];
在这之后,我可以按下按钮并立即访问信息(而在此之前,按钮将保持按下很短的时间)


关于为什么会这样,你有什么想法吗?

这与
NSMutableArray
NSArray
的实现方式有关

由于
NSArray
是不可变的,因此对象实际上存储在数组中,例如:

id *objects = malloc(sizeof(id) * count);
但是,当您处理
NSMutableArray
时,您处理的是一个链表,因为
NSMutableArray
需要对数组进行许多修改。因此,在链表上的查找要长得多,因为对象的存储方式不是在内存中有一个设定的距离


有关链表的更多信息,请检查。

注意,您的行
self.workingWithItemCollectionArray=[NSMutableArray arraywhithcapacity:self.itemCollectionArray.count]
完全没有必要,因为它只是浪费CPU周期创建一个空数组,然后在下一行删除它。你是说较大的可变数组比较小的可变数组处理得更快,因为可变数组的实现意味着以速度为代价的更多功能?简言之,是否真的因为可变数组的速度较慢而使其处理得更快@A-Live是的,就我对NSArray内部的理解而言,它是如何工作的……哦,天哪,那太棒了,我需要更多地思考这个概念。我的第一个猜测是,不可变数组(它本身或带有运行时助手,正如您所说的,它只有
id*count
bytes)在第一次转换为可变数组时存储了一些索引信息,因此在
addObjectsFromArray
期间,一个新的可变数组被部分索引。有趣的是,也许你有一些高级参考资料可以更深入地挖掘它?真正奇怪的是,如果我处理一个包含1000个对象的数组,然后再添加1个,它的处理速度更快。@Sooper go figure。我读到的一件事是,如果NSArray中的对象数量达到某个阈值(例如从数组列表到链表),它实际上会更改其内部表示形式,但我实际上没有经历过这种情况。我能告诉你的是,对于大多数“正常”情况,NSArray是一个真正的数组,而NSMutableArray是一个链表。这完全来自于我使用API的经验和一些性能测试。