iPhone:-[Codificación más rápida de NSConcreteMutableData]:selector no reconocido

StackOverflow https://stackoverflow.com/questions/668066

  •  21-08-2019
  •  | 
  •  

Pregunta

Estoy intentando hacer esto:

self.somestring = [@"hardcodedstring" stringByAppendingString:someotherstring];

Pero sigo recibiendo:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSConcreteMutableData fastestEncoding]: unrecognized selector sent to instance 0x1fb930'

No llamo a este método en ningún lado pero veo ese stringByAppendingString:lo llama en mi pila:

Stack: (
808221155,
806100816,
808224837,
807957033,
807851552,
812064725,
812064413,
18085, <== -[NSString stringByAppendingString:] + 109 in section LC_SEGMENT.__TEXT.__text of /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.1.sdk/System/Library/Frameworks/Foundation.framework/Foundation
817945012,
821160740,
821157652,
821149552,
807852041,
812070519,
807836299,
807834407,
827752032,
816118388,
816157144,
8381,
8244

) ¿Cómo solucionaría esto para que agregue la cadena, tal como se supone que debe hacerlo?Gracias,
isaac
Editar:Para acceder a alguna cadena, hago esto:

@property (nonatomic,retain) NSString *somestring;

En mi ViewController.h y:

@synthesize somestring;

En mi ViewController.m.
Editar:otra cadena viene de aquí:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {
    self.somestring = [@"hardcodedstring" stringByAppendingString:[UIImagePNGRepresentation(img) encodeBase64]]; //encodeBase64 encodes it to base64
}

Más Editar:Lo rompí:

2009-03-20 15:14:21.389 myproject[3467:20b] *** -[NSConcreteMutableData getCharacters:range:]: unrecognized selector sent to instance 0x1fa630
2009-03-20 15:14:21.403 myproject[3467:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSConcreteMutableData getCharacters:range:]: unrecognized selector sent to instance 0x1fa630'
2009-03-20 15:14:21.412 myproject[3467:20b] Stack: (
808221155,
806100816,
808224837,
807957033,
807851552,
807660389,
807733601,
807733297,
807891629,
812155873,
812293801,
18081,
817945012,
821160740,
821157652,
821149552,
807852041,
812070519,
807836299,
807834407,
827752032,
816118388,
816157144,
8381,
8244
)
terminate called after throwing an instance of 'NSException'
(gdb) info symbol 18081
-[InternalChoicesController imagePickerController:didFinishPickingImage:editingInfo:] + 73 in section LC_SEGMENT.__TEXT.__text of /Users/isaacwaller/Documents/myproject/build/Debug-iphoneos/myproject.app/myproject
(gdb) info symbol 812293801
NSLog + 25 in section LC_SEGMENT.__TEXT.__text of /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.1.sdk/System/Library/Frameworks/Foundation.framework/Foundation

Entonces creo que es un problema con la codificación de los datos Base64.El código que estoy usando es:

static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

@implementation NSData (Base64)

- (NSString *)encodeBase64;
{
if ([self length] == 0)
    return @"";

char *characters = malloc((([self length] + 2) / 3) * 4);
if (characters == NULL)
    return nil;
NSUInteger length = 0;

NSUInteger i = 0;
while (i < [self length])
{
    char buffer[3] = {0,0,0};
    short bufferLength = 0;
    while (bufferLength < 3 && i < [self length])
        buffer[bufferLength++] = ((char *)[self bytes])[i++];

    //  Encode the bytes in the buffer to four characters, including padding "=" characters if necessary.
    characters[length++] = encodingTable[(buffer[0] & 0xFC) >> 2];
    characters[length++] = encodingTable[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];
    if (bufferLength > 1)
        characters[length++] = encodingTable[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)];
    else characters[length++] = '=';
    if (bufferLength > 2)
        characters[length++] = encodingTable[buffer[2] & 0x3F];
    else characters[length++] = '=';    
}

return [[[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSASCIIStringEncoding freeWhenDone:YES] autorelease];
}

@end

Gracias, Isaac Waller.

¿Fue útil?

Solución

Me gustaría comprobar el código de errores tipográficos. El error indica muy claramente que una instancia de NSMutableData se está utilizando en donde se espera un NSString. Parecería que, o bien encodeBase64 es de alguna manera vuelve self o bien el UIImagePNGRepresentation prima (IMG) está consiguiendo pasó a stringByAppendingString:.

Si no es aparente, simplemente descomponerlo y comprobar en cada paso. (Estoy usando NSLog para este ejemplo, pero paso a paso con un depurador que funcionaría muy bien también, por supuesto.)

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {
    NSData *rep = UIImagePNGRepresentation(img);
    NSLog(@"Rep: %@", rep);
    NSString *base64 = [rep encodeBase64];
    NSLog(@"Base 64 is a %@", NSStringFromClass([base64 class]));
    self.somestring = [@"hardcodedstring" stringByAppendingString:base64]; //encodeBase64 encodes it to base64

}

Mi mejor conjetura es que usted está pasando por accidente en el NSData prima en lugar de un NSString -., Pero en su defecto, el código anterior deberá trabajar correctamente o mostrar exactamente donde las cosas se están descomponiendo

Otros consejos

@"Some String" no es un objeto, es una cadena literal.No puedes enviarle mensajes.Necesitará hacer algo más para unir esos hilos.

Algo como:

 [NSString stringWithFormat:@"%@%@", @"String 1", @"String 2"];

Aparentemente esto no es correcto.Los literales de cadena se tratan como objetos.

Como se menciona en los comentarios, también puede tener un problema con self.somestring también.Si no has declarado una propiedad o sintetizado somestring luego accediendo a través de self. Es incorrecto.solo deberías usar

somestring = [NSString stringWithFormat:@"%@%@", @"String 1", @"String 2"];

Si lo has hecho:

@interface myClass {
  NSString *somestring;
}
@property(nonatomic, retain) NSString *somestring;
@end

Y:

@implementation myClass
@synthesize somestring;
@end

Luego puedes acceder a la variable usando self.somestring, que en realidad es solo azúcar sintáctico para [self somestring].

Es importante señalar también que @property y @synthesize son en realidad trozos de azúcar sintácticos.Terminan haciendo algo similar a esto.

@interface myClass {
  NSString *somestring;
}

-(NSString *)somestring;
-(void)setSomestring:(NSString *)value;
@end

Y:

@implentation myClass
-(NSString *)somestring {
  return somestring;
}
-(void)setSomestring:(NSString *)value {
  somestring = value;
}
@end

Así que si no has declarado somestring como una propiedad y la sintetizó, entonces no tiene esos métodos para responder el mensaje que se pasa.

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