2009-03-20 9 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 

) 私はこれをどのように修正しますそれはそれが想定されているのと同じように、文字列を追加します。おかげで、
アイザック
編集

@property (nonatomic,retain) NSString *somestring; 
私ViewController.hで

と:私のViewController.mで

@synthesize somestring; 

somestringにアクセスするには、私がこれを行います。
編集: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 

おかげで、アイザック・ウォーラー

+0

私は、問題がself.somestringを設定しようとすることにあると思います。どのようにそれを宣言していますか? – cobbal

+0

他の文字列はどこから来ますか?それは文字列でないか、または割り当てが解除されているようです。 – Chuck

+0

この時点で、私は文を小さなものに分解します。それはUIImagePNGRepresentationのように見え始めているので、NSDataを返す必要はありません。 –

答えて

4

私はタイプミスのコードをチェックします。 NSMutableDataのインスタンスがNSStringが期待される場所で使用されていることを、エラーはかなり明確に示しています。 encodeBase64のどちらかがselfを返しているか、生のUIImagePNGRepresentation(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.からアクセスすると間違っています。

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

そして:

@implementation myClass 
@synthesize somestring; 
@end 

を次にあなたが本当に[self somestring]のためだけ糖衣構文であるself.somestringを使用して変数にアクセスすることができますあなたがやった場合はあなただけの

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

を使用する必要があります。

@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

関連する問題