2012-05-30 7 views
2

Travailler avec un objectif de base c exemple ici, a essayé d'utiliser replaceObjectAtIndex pour un tableau et il ne semble pas fonctionner.replaceObjectAtIndex ne semble pas fonctionner

mon code:

NSMutableArray *myArray=[NSMutableArray array]; 
    [myArray addObject:@"First string"]; 
    [myArray addObject:@"Second string"]; 
    [myArray addObject:@"Third string"]; 

    NSString *newElement=[myArray objectAtIndex:1]; 
    NSLog(@"New object at index 1 BEFORE is %@", newElement); 
    [myArray replaceObjectAtIndex:1 withObject:@"Hello"]; 
    NSLog(@"New object at index 1 AFTER is %@", newElement); 

théoriquement la sortie pour newElement devrait maintenant afficher "Bonjour", mais il affiche toujours "deuxième chaîne"

sortie:

2012-05-30 11:21:16.638 cocoa lab[753:403] New object at index 1 BEFORE is Second string 
2012-05-30 11:21:16.641 cocoa lab[753:403] New object at index 1 AFTER is Second string 

s'il vous plaît conseiller

merci

Répondre

5

Vous devez obtenir la nouvelle valeur du tableau après son remplacement

// ... 
[myArray replaceObjectAtIndex:1 withObject:@"Hello"]; 

/* ADD THIS */ 
newElement=[myArray objectAtIndex:1]; 

NSLog(@"New object at index 1 AFTER is %@", newElement); 

Au moment où vous allez chercher la chaîne d'origine, remplacez l'objet du tableau, et d'imprimer à nouveau la chaîne d'origine.

+1

hmm, pensait que newElement était un pointeur sur l'élément 1 du tableau, donc quand cet élément ont été changés, newElement refléterait il. Je ne pense pas. Merci d'avoir répondu. – Live2Enjoy7

+0

Les tableaux de style C fonctionnent comme vous les décrivez. Un pointeur sur le tableau est juste un pointeur vers le premier élément et vous pouvez ensuite ajouter un multiple de la taille des éléments, pour obtenir un pointeur vers un élément plus bas dans le tableau. L'objectif C 'NSArray's d'un autre côté, sont des objets. Les éléments du tableau sont également des objets. Et tous les pointeurs pointent vers les objets réels, pas un espace réservé dans le tableau. –

+0

@ Live2Enjoy7 'newElement' est une variable locale qui contient un pointeur vers un objet. Si vous ne réinitialisez pas le pointeur pour qu'il pointe vers un autre objet, il pointe toujours sur celui d'origine. – jlehr

0

Vous devez réinitialiser la valeur de newElement après avoir appelé replaceObjectAtIndex:, il faut donc ajouter une autre ligne avant de vous connecter à la valeur la deuxième fois:

newElement=[myArray objectAtIndex:1]; 

MISE À JOUR 1

Et ne vous sentez pas mal - - Nous l'avons tous fait à un moment ou à un autre. :-)

MISE À JOUR 2

Par ailleurs, une bonne façon d'éviter ce genre de problème en général est de prendre l'habitude d'utiliser des variables locales distinctes dans ce genre de situations, par exemple, vous pouvez réécrire le code affiché comme suit:

NSString *initialValue = [myArray objectAtIndex:1]; 
NSLog(@"New object at index 1 BEFORE is %@", initialValue); 

[myArray replaceObjectAtIndex:1 withObject:@"Hello"]; 

NSString *newValue = [myArray objectAtIndex:1]; 
NSLog(@"New object at index 1 AFTER is %@", newValue);