jsonObjectWithData导致内存崩溃?

时间:2014-09-28 02:02:55

标签: ios objective-c ipad cocoa-touch

我在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以更容易地显示进度条。

任何想法或提示都表示赞赏。

1 个答案:

答案 0 :(得分:0)

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

  

块引用

使用NSJSONReadingMutableContainers作为选项

  

块引用

如果以前不起作用,您将遇到如下所示的已知问题:

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

所以现在你有两个选择:

  1. 使用本机JSON序列化
  2. 首先将JSON文件下载到磁盘,而不使用AFNetworking而不是解析。