2009-04-12 62 views
1

我有一個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

回答

1

您可以使用for循環。從第一個索引開始,使用indexGreaterThanIndex:獲取下一個索引,並在您點擊最後一個索引後停止。

不要忘記考慮一個空的索引集。在這種情況下,第一個和最後一個索引將是NSNotFound。最簡單的方法是測試索引集的計數;如果它是零,不要循環。

另外,Jason Coco關於分析的說法。在你的程序運行之前,不要過分擔心效率問題,在你運行Shark(或者儀器,如果那是你的東西)之前不要去優化它,並且確切地發現什麼是慢的。

+0

感謝您的提示。我會嘗試對此進行基準測試,看看新方法是否更快。 – hyn 2009-04-12 08:11:19

0

我意識到這是一個非常古老的問題,但我在這裏發帖的情況下,任何人都發現了這個問題,你可以使用:

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

這是很多更簡潔。

相關問題