【发布时间】:2013-01-22 17:01:07
【问题描述】:
我正在尝试解析医学词典(.csv 文件),然后通过 UITextChecker:learnword 方法学习所有这些单词,以便拼写检查器将这些医学术语批准为有效单词。
我在另一个线程中调用此方法,但 csv 文件中的字数约为 50K。
- (void)parseMyCSVFile{
for (int i = 1; i < [csvContent count]; i++) {
NSString *learntWord = [NSString stringWithFormat:@"%@",[csvContent objectAtIndex:i]];
NSString *s = learntWord;
NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@" ()\n\""];
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""];
if ([UITextChecker hasLearnedWord:s]){
NSLog(@"skipped");
}
else
{
[UITextChecker learnWord:s]; // Memory Issue Here
NSLog(@"learning");
}
HUD.detailsLabelText = [NSString stringWithFormat:@"%i of %i",i,[csvContent count]];
}
[self performSelectorOnMainThread:@selector(bgWorkEnded) withObject:nil waitUntilDone:YES];
}
我应用了 Instruments Time Profiler,发现问题出在我在循环内学习单词的那一行。
应用尝试加载字典直到 5000 个单词(大约)然后崩溃。
任何帮助将不胜感激。
谢谢
【问题讨论】:
-
您肯定在以 Apple 的 QA 小组可能从未预料到的方式对 UITextChecker 进行压力测试。您是 1) 在后台线程而不是主 (UI) 线程中使用它,并且 2) 您尝试一次添加数千个单词。如果您没有从其他人那里得到体面的回应,我建议您打包尽可能多的代码(这表明了问题)并在http://bugreporter.apple.com 提交错误,将代码发送给他们自己尝试。
-
使用@autoreleasepool
-
您正在为每次迭代创建 2 个 NSStrings 和一个 NSCharacterSet。分析您的应用,看看这是否重要。
-
@MichaelDautermann 感谢您的回答。我也尝试在主线程中运行该应用程序,但它也崩溃了。尽管它几乎在 10K 字之后就崩溃了。另外,我在 bugreporter.apple.com 上提交了一个错误。让我们看看 Apple 何时回复我的问题 :)
-
@j_mcnally 我确实试过了,但用处不大。
标签: iphone ios memory-management csv