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

Я добавляю массив self.notes в UIPickerView. Вот как я устанавливаю массив:

 NSMutableArray *notesArray = [[NSMutableArray alloc] init];
 [notesArray addObject:@"-"];
 [notesArray addObjectsFromArray:[dbManager getTableValues:@"Notes"]];
 self.notes = notesArray;
 [notesArray release];

Информация для UIPickerView берется из базы данных следующим способом:

-(NSMutableArray *)getTableValues:(NSString *)table
{
  NSMutableArray *valuesArray = [[NSMutableArray alloc] init];
  if (sqlite3_open([self.databasePath UTF8String], &database) != SQLITE_OK)
  {
      sqlite3_close(database);
      NSAssert(0, @"Failed to open database");
  }
  else 
  {
   NSString *query = [[NSString alloc] initWithFormat:@"SELECT value FROM %@", table];
   sqlite3_stmt *statement;

   if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK)
   {
     while (sqlite3_step(statement) == SQLITE_ROW) {
     NSString *value =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
     [valuesArray addObject:value];
     [value release]; 
   }
   sqlite3_reset(statement);
  }
  [query release]; 
  sqlite3_finalize(statement);
  sqlite3_close(database);
 }
 return valuesArray;
}

Но я продолжаю получать утечки памяти в Инструментах для этих строк:

NSMutableArray * valuesArray = [[NSMutableArray alloc] init];

и

[valuesArray addObject: value];

Что я здесь не так делаю?

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

Ответы [ 2 ]

0 голосов
/ 14 января 2011

Вместо NSMutableArray *valuesArray = [[NSMutableArray alloc] init]; используйте эту строку:

NSMutableArray *valuesArray = [NSMutableArray array];

Что касается утечки [valuesArray addObject:value];, измените свой код на:

[valuesArray addObject:value];
value = nil;
0 голосов
/ 14 января 2011

Вы возвращаете valuesArray из getTableValues, который выделен, но не освобожден. Вы не можете выпустить его в методе, так как вызывающий объект все еще нуждается в нем. Правильный способ - это выпустить его автоматически.

return [valuesArray autorelease];

А также вам не нужно освобождать строку значений после добавления ее в valuesArray, поскольку она создается с помощью удобного конструктора.

...