2009-03-20 4 views
2

Я пытаюсь сделать это:iPhone: - [NSConcreteMutableData fastestEncoding]: непризнанные селектор

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

Но я получаю:

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

Я не называю этот метод в любом месте, но я вижу, что stringByAppendingString: называет его в своем стеке:

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 

) Как бы это исправить так что он добавляет строку, как и предполагалось. Спасибо,
Исаак
Редактировать: Для того, чтобы получить доступ к SomeString, я делаю это:

@property (nonatomic,retain) NSString *somestring; 

В моей ViewController.h и:

@synthesize somestring; 

В моей ViewController.m.
Edit: someotherstring приходит отсюда:

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

Больше Редактировать: Я сломал его:

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 

Так что я думаю, что это проблема с кодирования данных Base64? Код я использую:

static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 

@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 

Спасибо, Исаак Waller

+0

Я бы предположил, что проблема заключается в попытке установить self.somestring, как вы его объявляете? – cobbal

+0

Откуда взялась какая-то строчка? Похоже, это либо не строка, либо она была отменена. – Chuck

+0

В этот момент я бы разложил заявление на более мелкие. Поскольку это начинает выглядеть, как UIImagePNGRпредставление не возвращает NSData, как должно. –

ответ

4

Я бы уточнил код для опечаток. Ошибка довольно четко указывает, что экземпляр NSMutableData используется там, где ожидается NSString. Казалось бы, либо encodeBase64 каким-то образом возвращает self, либо исходное представление UIImagePNGR (img) переходит к stringByAppendingString:.

Если это не очевидно, просто сломайте его и проверьте на каждом шагу. (Я использую NSLog для этого примера, но ступая отладчик будет работать нормально, конечно, тоже.)

- (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 

}

Мое предположение, что вы случайно проходя в сыром NSData вместо NSString, но в противном случае вышеуказанный код должен либо работать правильно, либо точно показывать, где вещи разрушаются.

2

@"Some String" не является объектом, это строковый литерал. Вы не можете отправлять ему сообщения. Вам нужно будет сделать что-то еще, чтобы присоединиться к этим строкам.

Что-то вроде:

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

Видимо, это не правильно. Строковые литералы рассматриваются как объекты.

Как уже упоминалось в комментариях, у вас также может возникнуть проблема с self.somestring. Если вы не объявили свойство или синтезировали somestring, то доступ к нему через self. неверен. Вы должны просто использовать

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

Если вы сделали:

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

И:

@implementation myClass 
@synthesize somestring; 
@end 

Затем вы можете получить доступ к переменной с помощью self.somestring, которая на самом деле просто синтаксический сахар для [self somestring] ,

Важно также отметить, что @property и @synthesize являются собственно синтаксическими сажевыми битами. Они заканчивают делать что-то подобное этому.

@interface myClass { 
    NSString *somestring; 
} 

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

И:

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

Так что, если вы не объявили somestring как свойство и синтезировал его, то вы не те методы, чтобы ответить на сообщение передается.

+0

Теперь я получаю: *** - [NSConcreteMutableData getCharacters:]: нераспознанный селектор отправлен в экземпляр 0x1ed470? –

+0

В этом случае я тоже посмотрел бы на себя. В ответ я отправлю еще одно описание. –

+0

Это неверно. @ «Some String» - это объект. Вы можете отправлять ему сообщения. – Chuck

 Смежные вопросы

  • Нет связанных вопросов^_^