使用对象和键迭代NSArray的最快方法

时间:2010-03-31 01:50:04

标签: objective-c ios performance nsarray iteration

我有一个名为'objects'的NSArray,其中arrayCount = 1000.迭代此数组大约需要10秒。有没有人有更快的方法来迭代这个数组?

for (int i = 0; i <= arrayCount; i++) {
    event.latitude = [[[objects valueForKey:@"CLatitude"] objectAtIndex:i] floatValue];
    event.longitude = [[[objects valueForKey:@"CLongitude"] objectAtIndex:i] floatValue];
}

3 个答案:

答案 0 :(得分:4)

迭代NSArray的最快方法是使用fast enumeration。我的情况是:

for (id object in objects) {
    event.latitude = [[object valueForKey:@"CLatitude"] floatValue];
    event.longitude = [[object valueForKey:@"CLongitude"] floatValue]
}

答案 1 :(得分:2)

看起来valueForKey返回的数组在每次迭代时都是相同的,所以尝试在循环外部获取对它们的引用:

NSArray *latitudes = [objects valueForKey:@"CLatitude"];
NSArray *longitudes = [objects valueForKey:@"CLongitude"];
for (int i = 0; i <= arrayCount; i++) {
    event.latitude = [[latitudes objectAtIndex:i] floatValue];
    event.longitude = [[longitudes objectAtIndex:i] floatValue];
}

但循环的重点是什么?最后,是不是只将事件属性设置为两个数组中的最后一个值?另外,如果arrayCount是元素的数量,那么循环应该最多为i < arrayCount而不是i <= arrayCount

答案 2 :(得分:2)

添加其他人在此处所说的内容,快速枚举更快,因为它迭代C数组,而使用objectAtIndex:访问索引则具有Objective C对象消息传递的开销。可以把它想象为同时向NSArray对象询问所有内容,而不是单独询问每个对象。

enumerateObjectsUsingBlock:方法几乎同样快。块可以很强大,因为您可以将一大块代码分配给变量并传递它。

我一直在寻找实际的基准测试,并发现了这个:

http://darkdust.net/writings/objective-c/nsarray-enumeration-performance