Утечка памяти при использовании sqlite - PullRequest
3 голосов
/ 18 января 2011

Я получаю предупреждение об утечке памяти на приборах для этих строк:

 NSString *name =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];

 year = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];

Вот код для этого раздела:

-(NSMutableArray *)selectUsersList:(NSString *)condition:(NSString *)sort
{
    NSMutableArray *users = [[NSMutableArray alloc] init];

    if (sqlite3_open([self.databasePath UTF8String], &database) != SQLITE_OK)
    {
      sqlite3_close(database);
      NSAssert(0, @"Failed to open database");
    }
    else 
    {
      NSString *query = @"SELECT * FROM users";
      if (condition != nil)
      {
        NSString *newQuery = [NSString stringWithFormat:@"%@ %@", query, condition];
        query = newQuery;
      }
      if (sort != nil) {
        NSString *newsort = [NSString stringWithFormat:@"%@ %@", query, sort];
        query = newsort;
      }
      sqlite3_stmt *statement;

      if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK)
      {
        while (sqlite3_step(statement) == SQLITE_ROW) {
            NSString *name =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
            }
            NSString *year= @"";
            if (sqlite3_column_text(statement, 2) != nil)
            {
                year = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 2)];
            }

            User *user = [[User alloc] initWithName:name year:year];

            [users addObject:user]; 
            [user release];             
        }
    }
    sqlite3_finalize(statement);
    sqlite3_close(database);
  }
  return users;
}

Я хочу представить пустую строку ине «ноль» в представлении, поэтому сначала я устанавливаю пустую строку.Есть лучший способ сделать это?Как я могу решить эту утечку?

Спасибо за вашу помощь!

1 Ответ

5 голосов
/ 18 января 2011

После цикла while вы должны очистить память оператора sqlite3 с помощью sqlite3_finalize(). Итак:

if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
    while (sqlite3_step(statement) == SQLITE_ROW) {
        NSString *name =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];

        NSString *year= @"";
        if (sqlite3_column_text(statement, 1) != nil) {
            year = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
        }

        User *user = [[User alloc] initWithName:name year:year];
        [users addObject:user]; 
        [user release];   
    }
    sqlite3_finalize(statement); // DO THIS
}
...