用单个对象替换多个数组内容?

问题描述:

我有一个NSMutableArray与我想替换为NSNull对象的内容。用单个对象替换多个数组内容?

这是我做的:

NSMutableArray* nulls = [NSMutableArray array]; 

for (NSInteger i = 0; i < myIndexes.count; i++) 
    [nulls addObject:[NSNull null]]; 

[stageMap replaceObjectsAtIndexes:myIndexes withObjects:nulls]; 

我该怎么做更有效? 有没有办法枚举NSIndexSet,所以我可以逐个替换数组内容?

解决

建议的方法原来是快2倍(平均0.000565s VS 0.001210s):

if (myIndex.count > 0) 
{ 
    NSInteger index = [myIndex firstIndex]; 

    for (NSInteger i = 0; i < myIndex.count; i++) 
    { 
     [stageMap replaceObjectAtIndex:index withObject:[NSNull null]]; 
     index = [myIndex indexGreaterThanIndex:index]; 
    } 
} 
+0

这是行为效率低下吗?即在分析应用程序时,您看到此代码片段中的大幅减速? – 2009-04-12 06:48:07

您可以使用for循环。从第一个索引开始,使用indexGreaterThanIndex:获取下一个索引,并在您点击最后一个索引后停止。

不要忘记考虑一个空的索引集。在这种情况下,第一个和最后一个索引将是NSNotFound。最简单的方法是测试索引集的计数;如果它是零,不要循环。

另外,Jason Coco关于分析的说法。在你的程序运行之前,不要过分担心效率问题,在你运行Shark(或者仪器,如果那是你的东西)之前不要去优化它,并且确切地发现什么是慢的。

+0

感谢您的提示。我会尝试对此进行基准测试,看看新方法是否更快。 – hyn 2009-04-12 08:11:19

我意识到这是一个非常古老的问题,但我在这里发帖的情况下,任何人都发现了这个问题,你可以使用:

[indexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { 
     NSLog(@"index: %d", idx); 
     [objectArray replaceObjectAtIndex:idx 
           withObject:newObject]; 
    }]; 

这是很多更简洁。