Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 大JSON数据的内存问题_Ios_Json - Fatal编程技术网

Ios 大JSON数据的内存问题

Ios 大JSON数据的内存问题,ios,json,Ios,Json,我的公司已经创建了一个供iPad应用程序使用的web服务,由于没有内部的iOS开发经验,我们将这项工作外包出去 作为初始化过程的一部分,应用程序从web服务接收一组JSON格式的起始数据。对于大多数应用程序用户,此数据集的大小约为4 MB(未压缩),应用程序处理此数据时不会出现问题 对于较小的用户组,数据大小要大得多,大约65 MB未压缩。有了这个数据集,iPad应用程序崩溃了,开发者声称该应用程序正在被杀死,因为它使用了太多的内存。如果我理解正确,他们会说这是在试图将JSON解析为内存对象时发

我的公司已经创建了一个供iPad应用程序使用的web服务,由于没有内部的iOS开发经验,我们将这项工作外包出去

作为初始化过程的一部分,应用程序从web服务接收一组JSON格式的起始数据。对于大多数应用程序用户,此数据集的大小约为4 MB(未压缩),应用程序处理此数据时不会出现问题

对于较小的用户组,数据大小要大得多,大约65 MB未压缩。有了这个数据集,iPad应用程序崩溃了,开发者声称该应用程序正在被杀死,因为它使用了太多的内存。如果我理解正确,他们会说这是在试图将JSON解析为内存对象时发生的

我的感觉是,拥有1GB内存的设备在处理65MB的数据时应该不会有问题,但我没有iOS环境的经验来支持这一点


有人能够在iOS中处理大量JSON数据吗?如果问题是在内存中加载整个JSON数据集,是否有一个iOS流式JSON解析器使用更少的内存?

我认为问题不在于将JSON转换为NSDictionary/NSArray/NSStrings/NSNumber

我的猜测是,您正在紧密循环中使用json与自动释放对象的结果,例如在自动释放池清空之前为所有图像创建缩略图

如果它们不符合您的数据所做的,您能给我们一些示例,说明在数据集上正在做什么类型的工作吗

这是非常糟糕的代码,因为它将继续将压缩的uiimages堆栈到autorelease池中,直到所有图像下载并制作成缩略图后,才会命中该池

NSArray* images = [jsonObject objectForKey:@"images"];

for(NSString* imageURL in images){
    NSURL* url = [NSURL URLWithString: imageURL];
    NSData* data = [NSData dataWithContentsOfURL: url];
    UIImage* image = [UIImage imageWithData: data];
    // write image to disk
    UIImage* thumbnail = CreateThumbnailFromImage(image);
    // write thumbnail to disk
}
通过添加另一个自动释放池,可以更快地清理自动释放对象,从而修复相同的代码

for(NSString* imageURL in images){
    @autoreleasepool {
    NSURL* url = [NSURL URLWithString: imageURL];
    NSData* data = [NSData dataWithContentsOfURL: url];
    UIImage* image = [UIImage imageWithData: data];
    // write image to disk
    UIImage* thumbnail = CreateThumbnailFromImage(image);
    // write thumbnail to disk
    }
}

你看过RestKit了吗。异步数据得到处理。在我们公司工作,我们处理来自web服务的大量JSON。此外,一个短期解决方案可以是以固定大小的小数据包发送数据。更易于操作和使用。在2012年WWDC大会上,苹果表示iPad3上有650MB的可用硬内存限制(如果超过了watchdog,将导致应用程序死机),但没有其他设备有硬内存限制。但无论如何,你不能只发送10MB的JSON数据块,让应用程序一次一个地处理它们吗?最好的解决方案是以块的形式传递数据,这将解决问题并加快处理速度。@Robotcat谢谢你提供的信息。如果分解JSON是件小事,那么我会继续做下去。不幸的是,情况并非如此,我觉得我必须后退,因为我无法理解应用程序如何会耗尽内存。@adrift我同意后退。当然,这取决于开发者测试的是哪种设备,但如果是iPad3,我非常怀疑65MB的数据是否超过了650MB的限制。他们是否可以向您发送代码以供审阅,或者至少向您发送一份来自Instruments的分配跟踪,以证明分配了超过650MB的脏内存(并且可以通过查看错误跟踪来证明Watchdog正在终止应用程序)。JSON响应中的数据存储在数据库中。我不知道实施细节,因为这项工作是由承包商进行的。所讨论的数据并不复杂——都是字符串、日期或数值。你能详细说明一下自动释放池是什么吗?我问过是否有可能内存被分配了,但没有释放,我确信这不是问题所在。我的回答更加清晰了。