【问题标题】:jsonObjectWithData causing memory crash?jsonObjectWithData 导致内存崩溃?
【发布时间】:2014-11-22 17:27:28
【问题描述】:

我正在使用 AfNetworking 2.0 中的 AFHTTPRequestOperation 从服务器获取响应数据

NSURLRequest *request = [[ServiceHelper instance] getRequestData:postDict :[ServicesConfiguration GET_DOCUMENTS_URL]];
        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
        manager.requestSerializer = [AFHTTPRequestSerializer serializer];
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];

        AFHTTPRequestOperation *requestOperation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {

            NSDictionary *returnData = [[ServiceHelper instance] getReturnDictionary:responseObject];

        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Error: %@", error);
        }];

在 responseObject 上调用的 getReturnDictionary 方法是一个简单的 JSON Serializer..

- (NSDictionary *) getReturnDictionary : (NSData *) data {

    if ( data == nil ) {
        return [NSDictionary dictionary];
    }

    NSError * error = nil;
    NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

    if (error != nil) {
        NSLog(@"Error parsing JSON: %@",error);
        return [NSDictionary dictionary];
    }
    else
        return jsonDict;
}

这适用于少量数据。但是当响应对象像 100mb 时,应用会挂起

NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

然后大约 15 秒后,应用程序由于内存错误而崩溃。 我认为它非常不言自明,它的数据量很大,但它不应该能够处理它吗?

如果我直接从 [ NSURLConnection sendSynchronousRequest:] 获取数据; - 它可以在不挂起或崩溃的情况下工作。因为这是我最初所做的 - 但切换到 AFNetworking 以更轻松地显示进度条。

感谢任何想法或提示。

【问题讨论】:

  • 确切的错误是什么?
  • 没有错误。说“ 上的应用 意外终止。来自调试器的消息:由于内存错误而终止”
  • 这是以前报告过的已知问题。我更新了答案。还将为 AFNetworking 提交罚单。
  • 请注意,100MB 的 JSON 可能会解析为 500MB 的 iOS 对象,可能是两倍。

标签: ios objective-c ipad cocoa-touch


【解决方案1】:

更新: 所以你有两个选择来解决这个问题:

块引用

使用 NSJSONReadingMutableContainers 作为选项

块引用

如果以前不起作用,您将面临如下已知问题:

iOS Download & Parsing Large JSON responses is causing CFData (store) leaks

所以现在你有两个选择:

  1. 使用原生 JSON 序列化
  2. 首先在不使用 AFNetworking 的情况下将 JSON 文件下载到磁盘,然后再进行解析。

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2016-04-06
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多