我创建了一个涉及使用字典的游戏。它有大约73000字。但是,在审核过程后,该应用被拒绝了。以下是评论意见:
“我们发现您的应用在运行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];
答案 0 :(得分:1)
在我看来,好像73,000个单词会给记忆带来压力,而且可能完全不同。运行Instruments,使用分配工具监控内存发生的情况。确定这本字典是否确实存在错误。
那就是说,你所使用的策略并不是很好,原因有多种(包括你可能提出的那个)。您可以使用许多替代方法来让您在任何给定时间获取所需的字典部分,而不是当前的方法,据我所知,它始终存在于内存中。
一个简单的解决方案可能是转换为NSDictionary并从文件加载。另一个更复杂但更有效的解决方案是推出预先填充的CoreData数据库(例如,如果你窥探github,有很多现有的解决方案。)
答案 1 :(得分:0)
这似乎是一种非常缓慢且占用内存的方式来存储70k字。
我建议将整个字典存储在一个小的预加载的SQLite数据库中,或者至少存储一个二进制plist文件 - 数据库确实是一个更好的选择,因为你可以在没有所有内容都在内存中的情况下运行搜索。