2013-02-07 9 views
5

Sto cercando di analizzare un dizionario medico (file .csv) e quindi imparare tutte quelle parole tramite il metodo UITextChecker: learnword in modo che il correttore ortografico approvi quei termini medici come parole valide.UITextChecker: problema di memoria con l'apprendimento di migliaia di parole

Sto chiamando questo metodo in un altro thread ma la quantità di parole nel file csv è di circa 50 K.

- (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]; 

} 

ho applicato Instruments Tempo Profiler e ha scoperto che il problema sta nella linea in cui sto imparando parola all'interno del ciclo.

L'app tenta di caricare il dizionario fino a 5000 parole (circa) e quindi si blocca.

Qualsiasi aiuto sarebbe apprezzato.

Grazie

+4

Sei sicuramente stress testing UITextChecker in modi gruppo QA di Apple probabilmente mai previsto. Sei 1) usandolo in un thread in background invece del thread principale (UI) e 2) stai cercando di aggiungere migliaia di parole alla volta. Se non ottieni una risposta decente da qualcun altro, ti consiglio di impacchettare tutto il codice che puoi rivelare (che dimostra il problema) e di segnalare un errore su [http://bugreporter.apple.com] (http : //bugreporter.apple.com) inviando loro quel codice per provarlo da soli. –

+0

Utilizzare un @autoreleasepool –

+1

Si stanno creando 2 NSStrings e un NSCharacterSet per ogni iterazione. Profili la tua app per vedere se è significativa. – jcm

risposta

1

Non devi chiamare i metodi della classe UIKit su un thread in background - questo sarà risultato in incidenti. Inoltre, lo deve creare un pool di autorelease all'interno del metodo in modo da non perdere oggetti. Poiché UITextChecker deve essere utilizzato sul thread principale, ti consiglio di aggiungere solo poche parole alla volta, quindi di tornare al ciclo di esecuzione in modo da non arrestare l'app. Visualizza una selezione per l'utente durante questo processo in modo che sappiano cosa sta facendo.

0

basta cambiare il valore di i = 0. Questo ti aiuterà. Per esempio:

for (i=0; i<[csvContent count]; i++) 
Problemi correlati