我的公司创建了一个由iPad应用程序使用的Web服务,并且内部没有iOS开发经验,我们承包了这项工作。
作为初始化过程的一部分,应用程序以JSON格式从Web服务接收一组起始数据。对于大多数应用程序用户而言,此数据集大小约为4 MB(未压缩),应用程序可以毫无问题地处理此问题。
对于较小的用户组,数据大小要大得多,大约65 MB未压缩。使用此数据集,iPad应用程序崩溃,开发人员声称应用程序正在被杀死,因为它使用了太多内存。如果我理解正确,他们会说在尝试将JSON解析为内存中对象时会发生这种情况。
我的感觉是,具有1 GB内存的设备在处理65 MB数据时应该没有问题,但我没有使用iOS环境的经验。
有没有人能够在iOS中处理大量的JSON数据?如果问题是将整个JSON数据集加载到内存中,是否有一个用于iOS的流式JSON解析器会占用更少的内存?
答案 0 :(得分:1)
我不相信问题是将json转换为NSDictionaries / NSArrays / NSStrings / NSNumbers。
我的猜测是你在紧密循环中使用带有自动释放对象的json的结果,例如在清空自动释放的池之前为所有图像创建缩略图。
如果它们不适合您的数据,您能否举例说明数据集的工作类型是什么?
这是非常糟糕的代码,因为它会继续将umcompressed uiimages堆叠到自动释放池中,直到所有图像都被下载并制作成缩略图后才会被击中。
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
}
}