2009-11-23 5 views
5

Ich habe ein Problem im Zusammenhang mit Zeigern innerhalb von Arrays in objective-c gefunden.Ändern Sie die Werte in NSArray durch Dereferenzierung?

Ich versuche, die Zeiger innerhalb eines NSArray zu nehmen, sie an eine Methode zu übergeben und dann den zurückgegebenen Wert dem ursprünglichen Zeiger (dem Zeiger, der zu dem Array gehört) zurückzugeben.

Basierend auf was ich von C und C++ weiß, durch Dereferenzierung der Zeiger innerhalb des Arrays, sollte ich in der Lage sein, die Werte zu ändern, auf die sie zeigen ... Hier ist der Code, den ich verwende, aber es funktioniert nicht (Der Wert, auf den das Telefon zeigt, ändert sich niemals basierend auf der NSLog-Ausgabe).

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

Und hier ist die Methode Unterschrift ich das NSString * bin vorbei an:

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

Wie Sie sehen können, habe ich innerhalb phonenumbers mit dem variablen Telefon durch jeden NSString * am iterieren. Ich gebe das Telefon an removeNonNumbers :, das den geänderten NSString * zurückgibt. I Dereferenzieren Sie den von removeNonNumber zurückgegebenen Zeiger und weisen Sie den Wert dem Telefon zu.

Wie Sie sagen, ich wahrscheinlich nicht verstehen, Objective-C-Objekte, die gut. Ich bin mir ziemlich sicher, dass das in C++ oder C funktionieren würde, aber ich verstehe nicht, warum es hier nicht funktioniert! Vielen Dank im Voraus für Ihre Hilfe!

Antwort

13

Ja, das wird nicht funktionieren. Sie erhalten eine NSMutableArray benötigen:

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 ist kein C/C++ - Array. Es ist ein Objective-C-Objekt. Sie müssen die Klasse instance methods der Klasse NSArray verwenden, um Operationen daran auszuführen.

In Objective-C "Dereferenzieren" Sie niemals einen Objektzeiger, um seinen Wert festzulegen.

Auch Sie verwenden, was Fast Enumeration genannt wird, was nicht Mutation nicht gestattet.

0

Während dies bis zu einem gewissen Grad funktionieren kann, ich es nicht getestet habe ich diese unter ‚schlechte Idee‘ Datei würde und berühren sich nicht. NSArray und viele andere Kakaoobjekte sind ziemlich komplex und können als Teil des Klassencluster-Entwurfsmusters eine Vielzahl von Implementierungen unter der Haube haben.

Also, wenn es darauf ankommt, werden Sie wirklich nicht wissen, was Sie intern zu tun haben. NSArray ist eigentlich so konzipiert, dass es unveränderlich ist, daher ist die Bearbeitung vor Ort sogar eine schlechte Idee.

Objekte, die entworfen sind, um Sie mit den Interna herum zu verwirren setzen diese durch api Methoden wie NSMutableDatamutableBytes frei.

Du bist besser dran einen neuen NS (Mutable) Array mit den verarbeiteten Werten zu konstruieren.

4

Objektive-C-Objektvariablen können nicht dereferenziert werden. Sie sind immer Zeiger, aber Sie sollten sie als atomare Werte behandeln. Sie müssen das Array selbst so mutieren, dass es die neuen Objekte enthält, die Sie generieren.

1

Sie können auch enumerateObjectsUsingBlock: verwenden.

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

Kasse How do I iterate over an NSArray?