当前位置: 首页 > 面试题库 >

NSJSONSerialization结果为EXC_BAD_ACCESS

能业
2023-03-14
问题内容

目前,我正在编写一个应用程序(使用TargetiOS6,已启用ARC),该应用程序使用JSON进行数据传输,并使用CoreData进行持久存储。JSON数据是通过PHP脚本通过json_encode从MySQL数据库生成的。

我的问题是,对于某些表中的数据,以下代码将失败:

- (NSDictionary *)executeFetch:(NSString *)query
{
    NSURL *requesturl = [NSURL URLWithString:[query stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    NSError *dataError = nil;
    self.jsonData = [NSData dataWithContentsOfURL:requesturl options:kNilOptions error:&dataError];

    NSError *error = nil;
    self.jsonSerializationResult = [NSJSONSerialization JSONObjectWithData:self.jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error];

    return self.jsonSerializationResult;

}

程序始终在显示self.jsonSerializationResult的行上崩溃并显示EXC_BAD_ACCESS错误,而Instruments则显示检测到Zombie。我知道这意味着我向其发送消息的某个对象为nil,但是我无法找到解决方法。这就是Instruments要说的:

#   Address Category    Event Type  RefCt   Timestamp   Size    Responsible Library Responsible Caller
0   0xa1b8a70   CFString (mutable)  Malloc  1   00:01.603.081   32  Foundation  -[NSPlaceholderMutableString initWithBytesNoCopy:length:encoding:freeWhenDone:]
1   0xa1b8a70   CFString (mutable)  Release 0   00:01.603.137   0   Foundation  newJSONValue
2   0xa1b8a70   CFString (mutable)  Zombie  -1  00:01.603.259   0   Foundation  newJSONString

我的程序可以处理除此以外的所有JSON输出:

{
   "termin":[
      {
         "termin_id":"17",
         "veranstaltung_id":"20",
         "beginn":"2012-09-28 17:00:00",
         "ende":"2012-09-28 18:00:00",
         "freie_pl\u00e4tze":null
      },
      {
         "termin_id":"18",
         "veranstaltung_id":"26",
         "beginn":"2012-09-28 19:00:00",
         "ende":"2012-09-28 20:00:00",
         "freie_pl\u00e4tze":null
      },
      {
         "termin_id":"19",
         "veranstaltung_id":"26",
         "beginn":"2012-09-28 21:00:00",
         "ende":"2012-09-28 22:00:00",
         "freie_pl\u00e4tze":null
      },
      {
         "termin_id":"20",
         "veranstaltung_id":"46",
         "beginn":"2012-09-28 19:00:00",
         "ende":"2012-09-28 20:00:00",
         "freie_pl\u00e4tze":null
      },
      {
         "termin_id":"24",
         "veranstaltung_id":"66",
         "beginn":"2012-09-28 22:00:00",
         "ende":"2012-09-28 22:30:00",
         "freie_pl\u00e4tze":"120"
      }
   ]
}

我想到了一些可能的错误源,但似乎没有人负责:

  • jsonData或jsonSerializationResult可能为nil:不是
  • PHP生成无效的JSON:使用验证器进行了检查
  • 空值:其他表没有问题

有人知道吗?


问题答案:

看起来像是一个错误/缺点NSJSONSerialization。问题是由转义的unicode字符(freie_pl\u00e4tze而不是freie_plätze)引起的。您有两种选择-

  1. 将转义的Unicode转换为真实的Unicode字符。
  2. 使用另一个JSON引擎,例如JSONKit。JSONKit还声称比自己表现更好NSJSONSerialization


 类似资料:
  • ios5中apple增加了解析JSON的api——NSJSONSerialization。网上已经有人做过测试,NSJSONSerialization在效率上完胜SBJSON、TouchJSON、YAJL、JSONKit、NextiveJson。 NSJSONSerialization提供了将JSON数据转换为Foundation对象(一般都是NSDictionary和 NSArray)和Foun

  • 我们有以下内容:

  • 问题内容: 我有一个JSON字符串(来自PHP ,看起来像这样: 我想将其解析为iPhone应用程序的某种数据结构。我想对我来说最好的是拥有一个字典数组,因此数组中的第0个元素是带有键和的字典。 我不明白如何存储数据。到目前为止,这是我的代码: 这只是我在另一个网站上看到的示例。我一直在尝试通过打印出诸如此类的元素和事物的数量来读取对象,但是我一直在得到。 如何使用上面的JSON解析,并将其转换为

  • 问题内容: 我从Met Office Datapoint API读取JSON时遇到NSJSONSerialization问题。 我收到以下错误 我已经检查并认为这是根据字符位置的冒犯行 根据我尝试过的多个验证器,JSON本身似乎是有效的,并且我希望它也来自大型组织(如Met Office)。 NSJSONSerialization是否不能与’ó’之类的字符配合使用? 如果不是,我该如何更改编码类型

  • 问题内容: 我已经检查了很多其他线程,因为它们无法使用Django中的静态文件应用程序提供静态内容,但尚未找到解决方案。 settings.py 模板 相关行… 日志 从日志看来,路径是正确的,但可惜它仍然会产生404。 问题答案: 对于本地提供的静态文件, 如果您尚未 设置任何形式的静态文件收集并且运行的是Django 1.3+,我相信这是您引用静态文件时应采用的方式 注意,我在这里省略了。这是

  • 我正在制作一个php注册脚本,注册工作正常,所有内容都已成功输入数据库,激活电子邮件工作正常,但每当我使用mysqli查询来选择或更新信息时,它都不起作用。 例如,当我使用我知道数据库中存在的帐户登录时,它告诉我用户名不存在,当单击电子邮件中的激活链接时,查询无法以相同的方式更新数据库。 我相信这是一个非常简单的错误,我忽略了我的新手,但我找了几个小时后找不到合适的答案。我真的不确定问题出在哪里。