2009-11-23 8 views
5

J'ai rencontré un problème lié aux pointeurs dans les tableaux de l'objectif-c. Ce que j'essaie de faire est de prendre les pointeurs dans un NSArray, de les passer à une méthode, puis d'assigner la valeur retournée au pointeur d'origine (le pointeur qui appartient au tableau). D'après ce que je sais de C et C++, en déréférençant les pointeurs dans le tableau, je devrais être capable de changer les valeurs qu'ils pointent ... Voici le code que j'utilise, mais ça ne marche pas (le pointeur de la valeur ne change jamais en fonction de la sortie NSLog).Modifier les valeurs dans NSArray par déréférencement?

NSArray *phoneNumbers = [phoneEmailDict objectForKey:@"phone"]; 
    for (NSString* phone in phoneNumbers) { 
     (*phone) = (*[self removeNonNumbers:phone]); 
     NSLog(@"phone:%@", phone); 
    } 

Et voici la signature de la méthode que je passe le NSString * à:

- (NSString*) removeNonNumbers: (NSString*) string; 

Comme vous pouvez le voir, je suis Itère chaque NSString * dans phoneNumbers avec le téléphone variable. Je passe le téléphone à removeNonNumbers :, qui renvoie le NSString * modifié. Puis déréférencer le pointeur renvoyé par removeNonNumber et affecter la valeur au téléphone.

Comme vous pouvez le constater, je ne comprends probablement pas très bien les objets Objective-C. Je suis sûr que cela fonctionnerait en C++ ou C, mais je ne vois pas pourquoi ça ne marche pas ici! Merci d'avance pour votre aide!

Répondre

13

Oui, ça ne va pas marcher. Vous aurez besoin d'un NSMutableArray:

NSMutableArray * phoneNumbers = [[phoneEmailDict objectForKey:@"phone"] mutableCopy]; 
for (NSUInteger i = 0; i < [phoneNumber count]; ++i) { 
    NSString * phone = [phoneNumbers objectAtIndex:i]; 
    phone = [self removeNonNumbers:phone]; 
    [phoneNumbers replaceObjectAtIndex:i withObject:phone]; 
} 
[phoneEmailDict setObject:phoneNumbers forKey:@"phone"]; 
[phoneNumbers release]; 
2

NSArray n'est pas un tableau de style C/C++. C'est un objet Objective-C. Vous devez utiliser le instance methods de la classe NSArray pour effectuer des opérations sur celui-ci.

En Objective-C, vous ne "déréférerez" jamais un pointeur d'objet pour définir sa valeur.

En outre, vous utilisez ce qu'on appelle Fast Enumeration, ce qui ne permet pas la mutation.

0

Bien que cela puisse fonctionner dans une certaine mesure, je ne l'ai pas testé, je produis ce sous « mauvaise idée » et ne pas toucher. NSArray, et beaucoup d'autres objets de cacao, sont assez complexes et peuvent avoir une variété d'implémentations sous le capot dans le cadre du modèle de conception de cluster de classe. Donc, en fin de compte, vous ne saurez vraiment pas de quoi vous faites face en interne. NSArray est en fait conçu pour être immuable, donc l'édition est même doublement mauvaise.

Les objets conçus pour vous permettre de manipuler les composants internes exposent ceux-ci via des méthodes API telles que mutableBytes.

Il est préférable de construire un nouveau tableau NS (Mutable) avec les valeurs traitées.

4

Vous ne pouvez pas déréférencer les variables d'objet Objective-C. Ils sont toujours des pointeurs, mais vous devriez les traiter comme s'ils étaient des valeurs atomiques. Vous devez muter le tableau lui-même pour contenir les nouveaux objets que vous générez.

1

Vous pouvez également utiliser enumerateObjectsUsingBlock:.

NSArray *array = [NSArray array]; 
__block NSMutableArray *mutableCopyArray = [array mutableCopy]; 
[mutableCopyArray enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) { 
    [mutableCopyArray replaceObjectAtIndex:idx withObject:[object modifiedObject]]; 
}]; 

Commander How do I iterate over an NSArray?