Pregunta

Esto no tiene sentido para mí. Tal vez alguien aquí puede explicar por qué sucede esto.

Tengo un I alloc NSMutableString que en la parte superior de mi aplicación para el iPhone, tiene que poner a más tarde en el proceso. El resultado es un SIGABRT, que no se suman a mí. Aquí está el código:

Archivo de cabecera (simplificado):

@interface MyAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    NSMutableString *locationErrorMessage;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, copy) NSMutableString *locationErrorMessage;

@end

Y las partes pertinentes de la principal:

@implementation MyAppDelegate

@synthesize window;
@synthesize locationErrorMessage;

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    self.locationErrorMessage = [[NSMutableString alloc] init];  
}

- (void)anotherFunction {
    [self.locationErrorMessage appendString: @"Blah Blah Blah"];
}

Todo esto parece bastante simple. ¿Qué me falta?

¿Fue útil?

Solución

Yo llamaría a esto un error en cómo se generan los emisores de propiedad, pero la respuesta es bastante simple:

Se declaró la propiedad como (nonatomic, copy). Esto significa que cada vez que la propiedad se establece locationErrorMessage, que va a invocar copy en el nuevo valor y la utilización de dicha copia el valor de la propiedad.

Por desgracia, invocando copy en una NSMutableString no da lugar a una NSMutableString, que se traduce en un NSString (que no puede ser mutado usando algo como appendString:).

Así que la solución simple sería la de cambiar la declaración de propiedad de copy a retain.

(yo diría que el error sería: Si se declara una propiedad de un objeto mutable como copy, entonces el colocador copia realidad debería utilizar mutableCopy y no copy) => rdar: // 8416047

Otros consejos

Su propiedad es la copia de la cadena transferida. Una copia siempre es inmutable, por lo que está intentando enviar a un appendString: NSString inmutable. Declarar su propiedad como retain y funcionará o escribir un colocador personalizado que copia la cadena usando mutableCopy.

También tiene una pérdida de memoria, se debe utilizar [NSMutableString string] lugar de la secuencia alloc-init.

Por cierto, que tiene una fuga allí,

self.locationErrorMessage = [[NSMutableString alloc] init];

Usted está copiando el valor, pero nunca se suelte el real NSMutableString primera asignado.

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