2009-11-23 12 views
5

Me encontré con un problema relacionado con los punteros dentro de las matrices en Object-C.¿Cambiar los valores dentro de NSArray desreferenciando?

Lo que trato de hacer es tomar los punteros dentro de un NSArray, pasarlos a un método y luego asignar el valor devuelto al puntero original (el puntero que pertenece a la matriz).

Basado en lo que sé de C y C++, al eliminar la referencia de los punteros dentro de la matriz, debería ser capaz de cambiar los valores que señalan ... Aquí está el código que estoy usando, pero no está funcionando (el valor del teléfono apunta a que nunca cambia en función de la salida NSLog).

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

Y aquí está la firma del método que estoy pasando el NSString * a:

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

Como se puede ver, estoy cada iteración a través de NSString * dentro PHONENUMBERS con el teléfono variable. Paso el teléfono para eliminarNonNumbers :, que devuelve el NSString * modificado. Luego, elimino la referencia del puntero devuelto por removeNonNumber y asigne el valor al teléfono.

Como puede ver, probablemente no entiendo bien Objective-C. Estoy bastante seguro de que esto funcionaría en C++ o C, pero no veo por qué no funciona aquí. ¡Gracias de antemano por tu ayuda!

Respuesta

13

Sí, eso no va a funcionar. Se necesita de una 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 no es una matriz de estilo C/C++. Es un objeto Objective-C. Necesitará usar el instance methods de la clase NSArray para realizar operaciones en él.

En Objective-C nunca "desreferencia" un puntero de objeto para establecer su valor.

Además, está utilizando lo que se llama Fast Enumeration, que no permite la mutación.

0

bien esto puede funcionar hasta cierto punto, yo no lo he probado, me presento esto bajo 'mala idea' y no tocar. NSArray, y muchos otros objetos de cacao, son bastante complejos y pueden tener una variedad de implementaciones bajo el capó como parte del patrón de diseño de clúster de clase.

Así que, cuando se trata de hacerlo, realmente no sabrá a qué se enfrenta internamente. NSArray está diseñado para ser inmutable, por lo que la edición es una idea doblemente mala.

Los objetos que están diseñados para permitirle perder el tiempo con las partes internas exponer a través de métodos api como NSMutableData 's mutableBytes.

Será mejor que construya una nueva matriz NS (Mutable) con los valores procesados.

4

No se pueden desviar las variables del objeto Objective-C. Siempre son indicadores, pero debes tratarlos como si fueran valores atómicos. Necesita mutar la matriz para que contenga los nuevos objetos que está generando.

1

También puede usar enumerateObjectsUsingBlock:.

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

Pedido How do I iterate over an NSArray?

Cuestiones relacionadas