代码之家  ›  专栏  ›  技术社区  ›  Isaac Waller

iPhone:-[NSConcreteMutableData fastest编码]:无法识别的选择器

  •  2
  • Isaac Waller  · 技术社区  · 17 年前

    我正在尝试这样做:

    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;
    

    @synthesize somestring;
    


    编辑

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

    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
    

    谢谢,艾萨克·沃勒

    2 回复  |  直到 17 年前
        1
  •  4
  •   Chuck    17 年前

    我会检查代码中的拼写错误。该错误非常清楚地表明,在预期使用NSString的地方使用了NSMutableData的实例。似乎encodeBase64正在以某种方式返回 self 否则,原始UIImagePNG表示(img)将被传递给 stringByAppendingString: .

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

    }

        2
  •  2
  •   Benjamin Autin Andrés Bonilla    17 年前

    @"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 作为一个属性并对其进行合成,那么您就没有这些方法来回答传递的消息。