NSMutableString appendString genera una SIGABRT
-
02-10-2019 - |
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?
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.