Domanda

ho incontrato un problema relativo ai puntatori all'interno di matrici in Objective-C.

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

In base a quello che so da C e C ++, dereferenziando 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 ( i punti di telefonia valore non cambia in base al uscita NSLog).

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

E qui è la firma del metodo sto passando il NSString * a:

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

Come si può vedere, sto scorrendo ogni NSString * entro phoneNumbers con il telefono variabile. Passo il telefono per removeNonNumbers :, che restituisce il NSString modificata *. Ho poi dereference il puntatore restituito da removeNonNumber e assegnare il valore per telefono.

Come si può dire, probabilmente non capisco oggetti Objective-C che bene. Sono abbastanza sicuro che questo avrebbe funzionato in C ++ o C, ma non riesco a capire perché non funziona qui! Grazie in anticipo per il vostro aiuto!

È stato utile?

Soluzione

Si, che non sta andando a lavorare. 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];

Altri suggerimenti

Non si può risolvere il riferimento variabili oggetto Objective-C. Sono sempre i puntatori, ma si dovrebbe trattarli come se fossero valori atomici. È necessario mutare l'array per contenere i nuovi oggetti si sta generando.

NSArray non è un C / C ++ serie stile. Si tratta di un oggetto Objective-C. È necessario utilizzare il metodi istanza della classe NSArray per eseguire operazioni su di esso.

In Objective-C non hai mai "dereference" un puntatore oggetto per impostare il suo valore.

Inoltre, si sta utilizzando quello che viene chiamato veloce Enumeration , che non consente di mutazione.

È 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]];
}];

Come faccio a iterare su un NSArray?

Anche 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 cacao, abbastanza complesso e può avere una varietà di implementazioni sotto il cofano come parte del modello di progettazione di cluster classe.

Quindi, quando si scende ad esso vi davvero non si sa cosa si sta trattando internamente. NSArray in realtà è stato progettato per essere immutabili così in atto la modifica è anche doppiamente una cattiva idea.

Gli oggetti che sono stati progettati per farvi pasticciare con le parti interne espongono coloro attraverso i metodi API come NSMutableData di mutableBytes.

È meglio costruire un nuovo Array (Mutevole) NS con i valori elaborati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top