【问题标题】:SBJSON parser low memory warningSBJSON 解析器内存不足警告
【发布时间】:2012-10-29 13:08:47
【问题描述】:

我正在处理 JSON 数据解析,其中包含大量图像下载和数据解析。我有以下解析代码

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
  {   

     NSString *responseString = [[NSString alloc] initWithData:webdata encoding:NSASCIIStringEncoding];
     [webdata release];
     [connection release];
     NSDictionary *values = [(NSDictionary*)[responseString JSONValue] objectForKey:@"UserId"];
     NSDictionary *Active = [(NSDictionary*)[responseString JSONValue] objectForKey:@"Active"];
     [responseString release];
     NSString *UserID=[NSString stringWithFormat:@"%@",values];
     NSString *Status=[NSString stringWithFormat:@"%@",Active];
     [WSDelegate WServiceResponseMsg:@"WS_Authenticate_User" withResponse:UserID forParam:Status];
}

我有许多类使用上述代码进行解析,但由于 SBJSON 解析器,应用程序在一段时间后崩溃。在仪器中,由于内存不足警告,应用程序崩溃。

【问题讨论】:

  • 考虑使用 ARC(自动引用计数)。没有理由不这样做。它使 iOS 编码更加方便,并且很可能会解决您遇到的问题。
  • SBJson 3.1 需要 ARC 否则会泄漏。这不是 SBJson 中的错误。这里有很好的记录:github.com/stig/json-framework/blob/master/NEWS.md

标签: iphone ios ipad sbjson


【解决方案1】:

大多数开发人员在使用 SBJSONParser 时有一个非常错误的假设,即它存在内存泄漏。 SBJSONParser 没有任何泄漏,也不会在您的代码中引入泄漏。 确实,INSTRUMENTS 告诉您泄漏是因为 SBJSONParser,但它表示其他东西。泄漏是因为您实现 SBJSONParser API 的方式。您一定在代码中做错了什么。

查看仪器中的泄漏点。打开扩展详细信息工具栏,查看有泄漏的代码行。 Instruments 会告诉您最近的泄漏位置。

【讨论】:

  • 是的,你是对的。问题在于实现 SBJSON 解析器。由于以下行 NSDictionary values = [(NSDictionary)[responseString JSONValue] objectForKey:@"UserId"];但是我不知道我的代码在内存管理中哪里出错了?
  • 你在用字典值和 Active 做什么。我很确定这两个字典有问题
【解决方案2】:

更好的选择是使用作为 iOS 5 及更高版本的一部分的NSJSONSerialization

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
  {  
    NSMutableDictionary *values = [NSJSONSerialization JSONObjectWithData:receivedData options:NSJSONReadingMutableContainers error:&error];
}

【讨论】:

  • 我已经按照你的建议实现了代码,但我正面临着漏洞。在实现了你在上面给我的代码后,我已经上传了仪器的图像,但它在下面的行中产生了 100% 的内存泄漏,所以可以请告诉我内存管理哪里出了问题?
【解决方案3】:

终于得到了解决方案。只需使用下面的行进行 JSON 解析。删除 NSMutableDictionary 并使用 id :

 NSError *jsonError = nil;

 id allValues = [NSJSONSerialization JSONObjectWithData:webdata
                                                   options:0
                                                     error:&jsonError];

 NSArray *array = [allValues objectForKey:@"Contestants"];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-16
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多