5

UITextChecker医学辞書 (.csv ファイル) を解析し、 :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 語 (約) になるまで辞書を読み込もうとし、その後クラッシュします。

どんな助けでも大歓迎です。

ありがとう

4

2 に答える 2

1

バックグラウンド スレッドで UIKit クラス メソッドを呼び出さないでください。これにより、クラッシュが発生します。また、オブジェクトをリークしないように、メソッド内に自動解放プールを作成する必要があります。UITextChecker はメイン スレッドで使用する必要があるため、アプリを失速させないように、一度にいくつかの単語を追加してから実行ループに戻ることをお勧めします。このプロセス中にユーザーにスピナーを表示して、ユーザーが何をしているのかを理解できるようにします。

于 2013-06-19T06:40:39.563 に答える