2009-11-23 16 views
5

Mi sono imbattuto in un problema relativo ai puntatori all'interno di array in ogg-c.Modificare i valori all'interno di NSArray mediante dereferenziazione?

Quello che sto cercando di fare è prendere i puntatori all'interno di un NSArray, passarli a un metodo e quindi assegnare il valore restituito al puntatore originale (il puntatore che appartiene all'array).

Sulla base di ciò che so di C e C++, dereferendo i puntatori all'interno dell'array, dovrei essere in grado di modificare i valori a cui puntano ... Ecco il codice che sto usando, ma non funziona (il valore phone point non cambia mai in base all'output di NSLog).

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

Ed ecco la firma del metodo sto passando il NSString * a:

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

Come potete vedere, sto scorrendo ogni NSString * entro phoneNumbers con il telefono variabile. Passo il telefono per rimuovereNonNumbers :, che restituisce il NSString * modificato. Quindi, rimuovere il puntatore restituito da removeNonNumber e assegnare il valore al telefono.

Come potete vedere, probabilmente non capisco bene gli oggetti Objective-C. Sono abbastanza sicuro che funzionerebbe in C++ o C, ma non riesco a capire perché non funzioni qui! Grazie in anticipo per il vostro aiuto!

risposta

13

Sì, non funzionerà. Avrete bisogno di 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 non è un array di stile C/C++. È un oggetto Objective-C. È necessario utilizzare lo instance methods della classe NSArray per eseguire operazioni su di esso.

In Objective-C non si "rinvia" mai un puntatore a oggetti per impostarne il valore.

Inoltre, si utilizza quello che viene chiamato Fast Enumeration, che non consente la mutazione.

0

se questo può funzionare in una certa misura, non l'ho provato, mi piacerebbe File questo sotto 'cattiva idea' e non toccare. NSArray, e molti altri oggetti di cacao, sono abbastanza complessi e possono avere una varietà di implementazioni sotto il cofano come parte del modello di progettazione di cluster di classi.

Quindi, quando si arriva a questo, non si saprà davvero cosa si sta trattando internamente. NSArray è in realtà progettato per essere immutabile, quindi l'editing sul posto è doppiamente una cattiva idea.

Gli oggetti che sono progettati per farti scherzare con gli interni esporre quelli attraverso metodi API come NSMutableDatamutableBytes.

Si sta meglio costruendo una nuova matrice NS (Mutevole) con i valori elaborati.

4

Non è possibile dereferenziare le variabili oggetto Objective-C. Sono sempre puntatori, ma dovresti trattarli come se fossero valori atomici. È necessario modificare la matrice stessa per contenere i nuovi oggetti che si stanno generando.

1

È inoltre possibile utilizzare enumerateObjectsUsingBlock:.

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

Checkout How do I iterate over an NSArray?

Problemi correlati