【问题标题】:Best way to load a Dictionary into an Application? iOS将字典加载到应用程序中的最佳方法? iOS
【发布时间】:2013-05-16 22:25:41
【问题描述】:

我创建了一个涉及使用字典的游戏。它有大约73000字。然而,在审查过程之后,该应用程序被拒绝了。这是评论 cmets:

“我们发现您的应用在运行 iOS 6.1.3 的 iPad 上崩溃了” “点击播放按钮时应用程序崩溃。” “如果您的应用占用过多内存,您的应用可能会遇到此问题。”

我被难住了。运行 6.1.3 的 iPhone 或运行 6.1.3 的 iPad 上的应用程序没有问题。所以我假设它在 iPad mini 上崩溃了。有没有更有效的方法/更好的地方将字典加载到内存中?这是按下播放按钮后我目前的操作方式。提前致谢!

    NSString *filePath = [[NSBundle mainBundle] pathForResource: [NSString stringWithFormat: @"dictionary"] ofType:@"txt"]; //set where to get the dictionary from
    NSData* data = [NSData dataWithContentsOfFile:filePath]; //pull the content from the file into memory
    NSString* string = [[[NSString alloc] initWithBytes:[data bytes]
                                                 length:[data length] 
                                               encoding:NSUTF8StringEncoding] autorelease];//convert the bytes from the file into a string
    NSString* delimiter = @"\n";//split the string around newline characters to create an array
    currentDict = [string componentsSeparatedByString:delimiter];
    [currentDict retain];

【问题讨论】:

  • 包含您的文字的文件大小是多少?如果它小于大约 1,000,000 字节,我怀疑您的问题出在其他地方。 (他们有没有向您发送任何痕迹或转储信息?)
  • 您是否在其上运行过任何分析软件? XCode 附带的工具工具有一个称为分配的工具,可以让您深入了解内存的去向...
  • 文件为 1,745,228 字节。这有什么不同吗?
  • 你真的需要加载整个东西吗?无论如何,您当然应该配置应用程序。
  • 为什么不直接使用stringWithContentsOfFile:encoding:error: 而不是先创建一个NSData 对象,然后再将其转换为NSString。这将减少临时内存使用量(约 50%),尽管我怀疑这真的是这里的主要问题。二进制 plist 会更好,因为这样您就不必在每次加载时都拆分字符串。

标签: iphone ios ipad ios6.1


【解决方案1】:

在我看来,73,000 个单词似乎不会对记忆造成压力,而且可能完全是另外一回事。运行 Instruments,使用分配工具来监控你的内存发生了什么。确定是否真的是这本字典有问题。

也就是说,由于多种原因(包括您建议的原因),您使用的策略并不是很好。您可以使用许多替代方法来让您在任何给定时间获取您需要的字典部分,而不是您当前的方法,据我所知,它一直完全驻留在内存中。

一个简单的解决方案可能是转换为 NSDictionary 并从文件中加载它。另一个更复杂但更高效的解决方案是推出一个预填充的 CoreData 数据库(例如,如果你在 github 上窥探,就有许多现有的解决方案)。

【讨论】:

  • 目前尚不清楚如何加载 NSDictionary(或 NSArray,这会更有意义)将显着减少存储空间。
  • 谢谢!我试用了 Instruments,看来 Dictionary 是问题所在。我会试试 CoreData Db。
  • @HotLicks 它不需要更少的磁盘存储空间,但它可能会更有效地加载,因为您不必每次都拆分文件的行。使用当前的方法,您需要大约两倍的临时内存量,因为您同时在内存中拥有源字符串(整个文件)和行数组。
  • @ hotlicks一个数组肯定会工作,但是在选择一个集合类时要存储“字典”,我就无法看到阵列如何使字段“更多”的意义而不是字典类。 span>
  • @isaac - OP 的原始代码只是生成一个数组。他从来没有具体说明他在用这个“字典”做什么,而且由于这显然只是一个没有定义的单词列表,它甚至不适合 NSDictionary。也许是一个集合,但不是字典。
【解决方案2】:

这似乎是一种存储 70k 单词的异常缓慢且占用大量内存的方式。

我建议将整个字典存储在一个小的预加载 SQLite 数据库中,或者至少存储在一个二进制 plist 文件中 - 尽管数据库确实是一个更好的选择,因为您可以在所有内容都不在内存中的情况下运行搜索。

【讨论】:

    猜你喜欢
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2021-03-05
    • 2018-04-06
    相关资源
    最近更新 更多