Pregunta

I leído que los tipos de datos no mutables no se puede modificar una vez creados. (Por ejemplo NSString o NSArray).

Pero, ¿pueden ser re-inicializado para apuntar a un conjunto diferente de los objetos?

Si es así, lo uso liberación para liberar cualquier alloc de primera ronda en el tiempo entre usos? por ejemplo:

myArray declarada como NSArray * myArray en la interfaz, y como no atómica / retener conjunto property.myArray en código de inicialización a un punto a una matriz de cadenas como sigue.

self.myArray = [myString componentsSeparatedByString:@","];

Pero luego quiero volver a inicializar miMatriz para que apunte a un conjunto diferente de cuerdas

self.myArray = [myOtherString componentsSeparatedByString:@","];

¿Es posible? Gracias ...

¿Fue útil?

Solución

Sí se puede reinicializar el NSArray. Aquí está el código de ejemplo que he utilizado para re-inicializado el NSArray.

NSString *keywords = @"FirstName|LastName|Address|PhoneNumber";
NSArray *arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"First Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
                                  [arr objectAtIndex:2],[arr objectAtIndex:3]);
arr = nil;

keywords = @"First_Name|Last_Name|_Address|_PhoneNumber";
arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"Second Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
                                   [arr objectAtIndex:2],[arr objectAtIndex:3]);

Otros consejos

Realmente depende de lo que quieres decir con re-initialize . Puede asignar otro objeto inmutable a un puntero, debido a que los punteros no son constantes.

Ejemplo:

@interface MyObj : NSObject {
    NSString *name;                    // not needed in 64bit runtime AFAIK
}
@property(retain) NSString *name;      // sane people use copy instead of retain
                                       // whenever possible. Using retain can
                                       // lead to some hard to find errors.
@end

/* ... another file ... */

MyObj *theObject = [[[MyObj alloc] init] autorelease];

theObject.name = @"Peter";
NSString *oldName = theObject.name;

NSLog(@"%@", theObject.name);   // -> Peter
NSLog(@"%@", oldName);          // -> Peter

theObject.name = @"Martin";
NSLog(@"%@", theObject.name)    // -> Martin
NSLog(@"%@", oldName)           // -> Peter

Si el comportamiento anterior es lo que quiere, eso está bien.

Si desea que la última línea para volver Martin que está en problemas. Esos son cadenas constantes y son no destinado a ser modificado . Se podría, si realmente desea, modificar la memoria del objeto directamente, pero Esto es peligroso y no se recomienda. Utilizar los objetos mutables si necesita este tipo de comportamiento.

Por supuesto que pueden. Diciendo que un NSArray es inmutable no significa que un atributo de una clase de este tipo no se puede cambiar. No se puede cambiar el contenido, pero puede asignar un nuevo contenido a la misma.

Si desea realizar también cambiar la referencia imposible que debe utilizar la palabra clave const.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top