Проблема утечки памяти? - PullRequest
       4

Проблема утечки памяти?

0 голосов
/ 07 декабря 2010

Как я освобождаю 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;
}

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

Ответы [ 2 ]

3 голосов
/ 07 декабря 2010
return [_dataArray autorelease];

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

1 голос
/ 07 декабря 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...