2013-02-07 10 views
5

私は医学辞書(.csvファイル)を解析してからUITextChecker:learnwordメソッドを使ってそれらの単語をすべて学習し、スペルチェッカーがこれらの医学用語を有効な単語として承認します。UITextChecker:何千もの単語を学習したときのメモリの問題

私はこのメソッドを別のスレッドで呼び出していますが、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

あなたは間違いなく、AppleのQAグループは、おそらく予想していなかった方法でUITextCheckerストレステストしています。 1)メイン(UI)スレッドの代わりにバックグラウンドスレッドで使用し、2)一度に何千もの単語を追加しようとしています。誰かからまともな返答が得られない場合は、公開することができるコードをパッケージ化して(問題を示す)、[http://bugreporter.apple.com](http ://bugreporter.apple.com)は、コードを送信して自分自身で試してみることができます。 –

+0

@autoreleasepoolを使用する –

+1

2つのNSStringとNSCharacterSetをすべての反復で作成しています。あなたのアプリをプロファイリングして、それが重要かどうかを確認してください。 – jcm

答えて

1

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

0

i = 0の値を変更するだけです。これは役に立ちます。 例えば:

for (i=0; i<[csvContent count]; i++) 
関連する問題