2009-04-12 5 views
1

J'ai un NSMutableArray avec le contenu que je veux remplacer par NSNull objets.Remplacer plusieurs contenus de tableau par un seul objet?

C'est ce que je fais:

NSMutableArray* nulls = [NSMutableArray array]; 

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

[stageMap replaceObjectsAtIndexes:myIndexes withObjects:nulls]; 

Comment puis-je faire plus efficacement? Existe-t-il un moyen d'énumérer un NSIndexSet, afin que je puisse remplacer le contenu du tableau un par un?

Résolu

méthode proposée se révèle être 2 fois plus rapide (moyenne 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

Est-ce que ce comportement est inefficace? c'est-à-dire, lorsque vous profilez votre application, voyez-vous de grands ralentissements dans ce fragment de code? –

Répondre

1

Vous pouvez utiliser une boucle for. Commencez avec le premier index, utilisez indexGreaterThanIndex: pour obtenir l'index suivant et arrêtez après avoir tapé le dernier index. N'oubliez pas de prendre en compte un jeu d'index vide. Le premier et le dernier index seront NSNotFound dans ce cas. Le moyen le plus simple consiste à tester le compte de l'ensemble d'index; si c'est zéro, ne boucle pas.

En outre, ce que Jason Coco a dit au sujet du profilage. Ne vous inquiétez pas trop de l'efficacité jusqu'à ce que votre programme fonctionne, et n'allez pas optimiser les choses jusqu'à ce que vous ayez exécuté Shark (ou Instruments, si c'est votre truc) et trouvé exactement ce qui est lent.

+0

Merci pour le conseil. Je vais essayer de comparer cela et voir si la nouvelle approche est plus rapide. – hyn

0

Je sais que c'est une question très ancienne, mais je suis de poster ici au cas où quelqu'un d'autre trouve cette question, vous pouvez utiliser:

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

Ce qui est beaucoup plus succinct.