2010-12-07 6 views
0

Comment je libérer l'extrait suivant de tableauDonnees,Problème de fuite de mémoire?

+(NSMutableArray *)getData: (NSString *)dbPath 
{ 

    NSMutableArray *_dataArray = [[NSMutableArray alloc] init]; 
    if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) 
    { 
     NSString *sqlQuery = [NSString stringWithFormat:@"SELECT DISTINCT name FROM databaseTable"]; 
     sqlite3_stmt *selectstmt; 
     if(sqlite3_prepare_v2(database, [sqlQuery UTF8String], -1, &selectstmt, NULL) == SQLITE_OK) 
     { 
      while (sqlite3_step(selectstmt) == SQLITE_ROW) 
      { 
       [_dataArray addObject:[NSString stringWithFormat:@"%d", sqlite3_column_int(selectstmt, 0)]]; 
      } 
     } 
     sqlite3_finalize(selectstmt); 
    } 
    sqlite3_close(database); 
    return _dataArray; 
} 

La méthode ci-dessus me donne fuite de mémoire et il me devient sérieux problème à l'avenir travail d'application.

Répondre

3
return [_dataArray autorelease]; 

Si vous souhaitez renvoyer des objets conservés, vous devez le rendre clair en suivant les conventions de dénomination. la méthode devrait commencer par new, create ou copy. Sinon, vous devriez retourner un objet autoreleased.

+0

+1 pour respecter les conventions de dénomination recommandées. – cbranch

1

Je ne vois pas de fuites évidentes dans le code que vous avez publié. La fonction renvoie un NSMutableArray qui a été alloué, de sorte que l'appelant serait responsable d'appeler release à un moment ultérieur. Ou, vous pouvez choisir d'en faire un objet autorelease.

De plus, vous voulez probablement appeler sqlite3_close() que si sqlite3_open() a réussi (à savoir, déplacer sqlite3_close() à l'intérieur la première déclaration if). Même idée pour sqlite3_finalize().

Il y a une initialisation ponctuelle que SQLite fait implicitement, mais vous ne devriez pas avoir à vous soucier de cela. Consultez les documents pour:

int sqlite3_initialize(void); 
int sqlite3_shutdown(void); 

Quel type d'objet (s) sont signalés comme des fuites?