2010-12-07 2 views
0

Как я отпуская DataArray из следующего фрагмента кода,Проблема с утечкой памяти?

+(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; 
} 

Описанный выше метод дает мне утечку памяти и получать меня серьезные проблемы в будущем работы приложения.

ответ

3
return [_dataArray autorelease]; 

Если вы хотите вернуть сохраненные объекты, вам необходимо сделать это ясно, следуя соглашениям об именах. метод должен начинаться с нового, создавать или копировать. В противном случае вы должны вернуть объект с автореализацией.

+0

+1 для следующих рекомендуемых соглашений об именах. – cbranch 2010-12-07 13:29:04

1

Я не вижу явных утечек в коде, который вы опубликовали. Функция возвращает NSMutableArray, который был выделен, поэтому вызывающий абонент будет отвечать за вызов release в какой-то более поздний момент. Или вы можете сделать это autorelease.

Кроме того, вы, вероятно, хотите вызвать sqlite3_close(), только если sqlite3_open() удалось (т.е. переместить sqlite3_close() в внутри первый if заявление). Такая же идея для sqlite3_finalize().

Существует некоторая однократная инициализация, которую SQLite делает неявно, но вам не нужно беспокоиться об этом. Проверьте документы для:

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

Какие типы объектов сообщаются как утечки?

Смежные вопросы