2

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

作为初始化过程的一部分,应用程序从 Web 服务接收一组 JSON 格式的起始数据。对于大多数应用程序用户来说,这个数据集的大小约为 4 MB(未压缩),应用程序可以毫无问题地处理这个问题。

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

我的感觉是具有 1 GB 内存的设备在处理 65 MB 数据时应该没有问题,但我没有基于 iOS 环境的经验。

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

4

1 回答 1

1

I don't believe the issue is with converting json into NSDictionaries/ NSArrays / NSStrings / NSNumbers.

My guess would be that you are using the result of the json with autoreleased objects in a tight loop, such as creating thumbnails for all images before the autoreleased pool is emptied.

If they doesn't not fit what your data is doing, can you give us some example as to what type of work is being done on the data set?

This is very bad code because it will continue to stack umcompressed uiimages into the autorelease pool which won't be hit until all the images have been downloaded and made into thumbnails.

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
}

The same code can be fixed by adding in another autorelease pool that will clean up the autoreleased objects sooner.

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
    }
}
于 2012-06-29T20:49:03.517 回答