gpt4 book ai didi

ios - 大型 JSON 数据的内存问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:50:27 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

我认为问题不在于将 json 转换为 NSDictionaries/NSArrays/NSStrings/NSNumbers。

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

如果它们不适合您的数据正在做的事情,您能否举例说明正在对数据集进行什么类型的工作?

这是非常糟糕的代码,因为它会继续将未压缩的 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
}
}

关于ios - 大型 JSON 数据的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11265765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com