iPhone:-[NSCONCETEUMABLE数据快速编码]:无法识别的选择器

iPhone:-[NSCONCETEUMABLE数据快速编码]:无法识别的选择器,iphone,nsstring,Iphone,Nsstring,我正在尝试这样做: self.somestring = [@"hardcodedstring" stringByAppendingString:someotherstring]; 但我一直得到: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSConcreteMutableData fastestEncoding]: unrecognized selecto

我正在尝试这样做:

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
在my ViewController.h和:

@synthesize somestring;
在my ViewController.m.
编辑:此处还有其他字符串:

- (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[] = "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
static const char encodingTable[]=“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz012456789+/”;
@实现NSData(Base64)
-(NSString*)编码器base64;
{
如果([自身长度]==0)
返回@”;
字符*字符=malloc((([自身长度]+2)/3)*4);
如果(字符==NULL)
返回零;
整数长度=0;
整数i=0;
而(i<[自身长度])
{
字符缓冲区[3]={0,0,0};
短缓冲区长度=0;
而(缓冲长度<3&&i<[自身长度])
缓冲区[bufferLength++]=((字符*)[self bytes])[i++];
//将缓冲区中的字节编码为四个字符,必要时包括填充“=”字符。
字符[length++]=编码表[(缓冲区[0]&0xFC)>>2];
字符[length++]=编码表[(缓冲区[0]&0x03)>4];
如果(缓冲长度>1)
字符[length++]=编码表[(缓冲区[1]&0x0F)>6];
其他字符[length++]='=';
如果(缓冲长度>2)
字符[length++]=编码表[buffer[2]&0x3F];
其他字符[length++]='=';
}
返回[[[NSString alloc]initWithBytesNoCopy:字符长度:长度编码:NSASCISTRINGENCODING freeWhenDone:是]自动删除];
}
@结束
谢谢,Isaac Waller

@“某些字符串”
不是对象,而是字符串文字。你不能向它发送消息。你需要做些别的事情来连接这些字符串

比如:

 [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
以及:

然后您可以使用
self.somestring
访问变量,这实际上只是
[self-somestring]
的语法糖

还需要注意的是,
@property
@synthesis
实际上是语法糖位本身。他们最终做了类似的事情

@interface myClass {
  NSString *somestring;
}

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


因此,如果您没有将
somestring
声明为属性并合成它,那么您就没有那些方法来回答正在传递的消息。

我会检查代码是否有拼写错误。该错误非常清楚地表明,在需要NSString的地方使用了NSMutableData实例。似乎encodeBase64以某种方式返回了
self
,或者原始UIImagePNGRepresentation(img)被传递到
stringByAppendingString:

如果不明显,只需将其分解并在每一步进行检查。(本例中我使用的是NSLog,但使用调试器也可以正常工作。)

}


我最好的猜测是,您无意中传入了原始NSData而不是NSString,但如果没有传入,上述代码应该可以正常工作,或者准确地显示故障所在。

我猜问题在于试图设置self.somestring,您是如何声明它的?someotherstring从何而来?听起来它不是一个字符串,或者它已被解除分配。在这一点上,我将把语句分解成更小的语句。因为看起来UIImagePNGRepresentation并没有像它应该返回的那样返回NSData。现在我得到:**-[NSConcreteMatableData getCharacters::]:未识别的选择器发送到实例0x1ed470?在这种情况下,我也会考虑self.something。我会在回答中进一步描述。这是不正确的@“某个字符串”是一个对象。你可以向它发送消息。是的,这就是@“”语法的原因。仅使用“”创建一个C字符串文字,而@表示NXConstantString的实例。它在应用程序二进制文件中表示为字符串文字,但在运行时是真正的字符串。啊,我认为主要区别在于@“创建Unicode字符串”,而“”是bog标准的C字符[]。
@implementation myClass
@synthesize somestring;
@end
@interface myClass {
  NSString *somestring;
}

-(NSString *)somestring;
-(void)setSomestring:(NSString *)value;
@end
@implentation myClass
-(NSString *)somestring {
  return somestring;
}
-(void)setSomestring:(NSString *)value {
  somestring = value;
}
@end
- (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