【问题标题】:Can't initialize an NSMutableData with an NSData (which contains a png)无法使用 NSData(包含 png)初始化 NSMutableData
【发布时间】:2010-01-13 22:09:21
【问题描述】:

我的 iPhone 应用程序出现错误。我使用 CameraPicker 制作并获取图片,然后将其提供给我的方法 sendPhoto,该方法会将照片发送到 TweetPhoto。在我用 NSData 初始化 NSMutableDate 之前,一切都很好。代码如下:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    [picker dismissModalViewControllerAnimated:YES];
    NSData *imageData = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    [self sendPhoto:(NSString*)@"lola" tweet:(BOOL)TRUE photo:(NSData*)imageData tags:(NSString*)@"" longitude:(float)1024 latitude:(float)512];
}

这里是 sendPhoto 方法:

- (void)sendPhoto:(NSString*)message tweet:(BOOL)tweet photo:(NSData*)photo tags:(NSString*)tags longitude:(float)longitude latitude:(float)latitude {
    NSString *url;
    if (tweet) {
        url = [NSString stringWithFormat:@"http://www.tweetphoto.com/uploadandpostapiwithkey.php"];
    } else {
        url = [NSString stringWithFormat:@"http://www.tweetphoto.com/uploadapiwithkey.php"];
    }

    NSString * boundary = @"tweetPhotoBoundaryParm";
    NSMutableData *postData = [NSMutableData dataWithCapacity:[photo length] + 1024];
    //!!!Here is the error!!!!                      
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

    NSString * userNameString = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"username\"\r\n\r\n%@", [prefs stringForKey:@"username_preference"]];
    NSString * passwordString = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"password\"\r\n\r\n%@", [prefs stringForKey:@"password_preference"]];
    NSString * apiString = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"api_key\"\r\n\r\n3eceaa7c-6d4d-41ab-be90-2a780e2d1961"];
    NSString * messageString = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"message\"\r\n\r\n%@", message];
    NSString * tagsString = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"tags\"\r\n\r\n%@", tags];
    NSString * latString = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"latitude\"\r\n\r\n%f", latitude];
    NSString * longString = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"longitude\"\r\n\r\n%f", longitude];
    NSString * boundaryString = [NSString stringWithFormat:@"\r\n--%@\r\n", boundary];
    NSString * boundaryStringFinal = [NSString stringWithFormat:@"\r\n--%@--\r\n", boundary];

    [postData appendData:[boundaryString dataUsingEncoding:NSUTF8StringEncoding]];
    [postData appendData:[userNameString dataUsingEncoding:NSUTF8StringEncoding]];
    [postData appendData:[boundaryString dataUsingEncoding:NSUTF8StringEncoding]];
    [postData appendData:[passwordString dataUsingEncoding:NSUTF8StringEncoding]];
    [postData appendData:[boundaryString dataUsingEncoding:NSUTF8StringEncoding]];
    [postData appendData:[apiString dataUsingEncoding:NSUTF8StringEncoding]];
    [postData appendData:[boundaryString dataUsingEncoding:NSUTF8StringEncoding]];
    //(...)
}

(sendImage 方法是 http://davidjhinson.wordpress.com/2009/06/01/posting-photos-using-objective-c/

控制台也这样说:* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[UIImage length]: unrecognized selector sent to instance 0x3b28df0'

感谢您的帮助。也许我只是在代码中犯了一个愚蠢的错误,但请不要生气,因为我只是学习编程 2 1/2 周。

【问题讨论】:

  • 它只是崩溃了 - 我知道错误一定存在,因为我尝试使用断点。
  • 哦,控制台说:*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*** -[UIImage 长度]:无法识别的选择器发送到实例 0x3b28df0”

标签: iphone objective-c initialization nsdata nsmutabledata


【解决方案1】:

听起来您将 UIImage 传递给此方法,而不是 NSData 块。您可以尝试记录照片参数吗?

【讨论】:

  • 但我写的是:NSData *imageData = [info objectForKey:@"UIImagePickerControllerOriginalImage"];,是不是错了?我如何/应该如何记录照片参数?
  • 多亏了你。刚刚写了这个:UIImage * images = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; NSData *imageData = UIImageJPEGRepresentation(images, 1);
  • 供以后参考,可以使用NSLog(@"Photo: %@", photo);
【解决方案2】:

您遇到的具体错误是什么?换句话说,是什么让您认为您指出的行有错误?

如果崩溃,控制台打印的错误是什么?

【讨论】:

  • 应用程序只是在这一行崩溃。我在此行之后和之前使用 /* 代码进行了尝试,并且应用程序仅在此行中崩溃。当然,我也尝试过使用断点,在这一行中应用程序崩溃了。
  • “崩溃”可能意味着任何事情。崩溃的原因将打印到您的调试控制台。如果没有这些信息,任何人都很难确定崩溃的原因。
  • 哦,控制台说:*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*** -[UIImage 长度]:无法识别的选择器发送到实例 0x3b28df0”
  • 我是否正确使用了 CameraPicker NSData *imageData = [info objectForKey:@"UIImagePickerControllerOriginalImage"];?我可以像在 sendPhoto 方法中那样获得它的长度吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
相关资源
最近更新 更多