1

当我在模拟器中运行我的应用程序时,一切正常。但是当我在 Ipad 中运行相同的应用程序时,会抛出异常。

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“数据参数为 nil。在我的应用程序中,我必须请求一个 web-URl 并且需要解析返回的JSON响应。但是我已经检查了 web-url 并且能够在模拟器中完美解析。但是所有问题都出现在真正的 ios 设备中。但我想我已经确定了出错的代码。

+ (NSDictionary*) getParsedJSON:(NSString*) urlString {
NSLog(@"################################################################################");
NSLog(@"getParsedJSON => urlString:");
NSLog(@"%@", urlString);

NSURL* url = [NSURL URLWithString:urlString];
NSURLRequest* request = [NSURLRequest requestWithURL:url];

NSURLResponse *response1 = nil;
NSError *error = nil;

NSData* response = [NSURLConnection sendSynchronousRequest:request returningResponse:&response1 error:&error];

//NSData* response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSLog(@"--------------------------------------------------------------------------------");
NSString* responseString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
NSLog(@"getParsedJSON => responseString:\n%@", responseString);
NSLog(@"--------------------------------------------------------------------------------");
NSError* jsonParsingError = nil;
NSDictionary* parsedJSON = [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError]; // here is place where exception seems to be thrown.
if (jsonParsingError) {
    NSLog(@"ERROR in parsing JSON: %@", jsonParsingError);
} else {
    NSLog(@"getParsedJSON => parsedJSON: \n%@", [parsedJSON description]);
}
NSLog(@"################################################################################");    
return parsedJSON;

}

我已经确定了似乎是错误的行。我还附上了异常报告的屏幕截图。控制台截图.希望您有经验的答复。

4

3 回答 3

1

正如我们从日志中看到的那样,当您在设备上使用它时,您的响应字符串为空。这可能是由于某些 Internet 访问问题。尝试使用:

if([response isequaltostring:@"(null)"]||response == nil || response.length == 0)
{
NSError* jsonParsingError = nil;
NSDictionary* parsedJSON = [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError]; // here is place where exception seems to be thrown.
if (jsonParsingError) {
NSLog(@"ERROR in parsing JSON: %@", jsonParsingError);
} 
else {
NSLog(@"getParsedJSON => parsedJSON: \n%@", [parsedJSON description]);
     }
}

还尝试添加异常断点并发布应用程序崩溃的确切位置。让我知道结果。

于 2013-09-01T13:12:12.967 回答
1

首先,你需要在 Xcode 中设置一个异常断点——这里有很多关于如何做到这一点的帖子。其次,在每个创建或返回对象的语句之后,添加一个断言:

NSURL *foo = ...
assert(foo);

这样做将帮助您找到第一个问题而不是最后一个问题。

于 2013-09-01T12:41:12.363 回答
0

根据您的日志,您的响应字符串为空!

做好以下两件事!

  • 添加 NSLog(@"响应数据:%@",response); 并检查响应是否有价值?
  • 如果“响应”有值,则将其转换为字符串 - 记录字符串值 - 并检查任何键是否具有 nil 值?

'NSJSONSerialization JSONObjectWithData' 方法如果找到任何具有 nil 值的键,就会崩溃。

于 2013-09-02T07:31:38.367 回答