title: iPhone: -[NSConcreteMutableData fastestEncoding]: unrecognized selector
body: <p>I am trying to do this:</p>
  
  <pre><code>self.somestring = [@"hardcodedstring" stringByAppendingString:someotherstring];
  </code></pre>
  
  <p>But I keep getting:</p>
  
  <pre><code>*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSConcreteMutableData fastestEncoding]: unrecognized selector sent to instance 0x1fb930'
  </code></pre>
  
  <p>I don't call this method anywhere but I see that stringByAppendingString: calls it in my stack:</p>
  
  <pre><code>Stack: (
  808221155,
  806100816,
  808224837,
  807957033,
  807851552,
  812064725,
  812064413,
  18085, &lt;== -[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
  </code></pre>
  
  <p>)
  How would I fix this so that it appends the string, just like it is supposed to. Thanks,<br>
  Isaac<br>
  <strong>Edit</strong>: To access somestring, I do this:</p>
  
  <pre><code>@property (nonatomic,retain) NSString *somestring;
  </code></pre>
  
  <p>In my ViewController.h and:</p>
  
  <pre><code>@synthesize somestring;
  </code></pre>
  
  <p>In my ViewController.m.<br>
  <strong>Edit</strong>: someotherstring comes from here:</p>
  
  <pre><code>- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {
      self.somestring = [@"hardcodedstring" stringByAppendingString:[UIImagePNGRepresentation(img) encodeBase64]]; //encodeBase64 encodes it to base64
  }
  </code></pre>
  
  <p><strong>More Edit</strong>: I broke it up:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>So I think it is a problem with encoding the Base64 data? The code I am using is:</p>
  
  <pre><code>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 &lt; [self length])
  {
      char buffer[3] = {0,0,0};
      short bufferLength = 0;
      while (bufferLength &lt; 3 &amp;&amp; i &lt; [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] &amp; 0xFC) &gt;&gt; 2];
      characters[length++] = encodingTable[((buffer[0] &amp; 0x03) &lt;&lt; 4) | ((buffer[1] &amp; 0xF0) &gt;&gt; 4)];
      if (bufferLength &gt; 1)
          characters[length++] = encodingTable[((buffer[1] &amp; 0x0F) &lt;&lt; 2) | ((buffer[2] &amp; 0xC0) &gt;&gt; 6)];
      else characters[length++] = '=';
      if (bufferLength &gt; 2)
          characters[length++] = encodingTable[buffer[2] &amp; 0x3F];
      else characters[length++] = '=';    
  }
  
  return [[[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSASCIIStringEncoding freeWhenDone:YES] autorelease];
  }
  
  @end
  </code></pre>
  
  <p>Thanks, Isaac Waller</p>