Как решить утечки памяти для следующего кода Sqlite? - PullRequest
0 голосов
/ 04 июля 2011

Я получаю утечки памяти в приборах в следующем коде Sqlite.

NSArray *result = [self executeQuery:sql arguments:argsArray];

Вызывает следующий метод.

- (NSArray *)executeQuery:(NSString *)sql arguments:(NSArray *)args {
sqlite3_stmt *sqlStmt;

if (![self prepareSql:sql inStatament:(&sqlStmt)])
    return nil;

int i = 0;
int queryParamCount = sqlite3_bind_parameter_count(sqlStmt);
while (i++ < queryParamCount)
    [self bindObject:[args objectAtIndex:(i - 1)] toColumn:i inStatament:sqlStmt];

NSMutableArray *arrayList = [[NSMutableArray alloc] init];
int columnCount = sqlite3_column_count(sqlStmt);
while ([self hasData:sqlStmt]) {
    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
    for (i = 0; i < columnCount; ++i) {
        id columnName = [self columnName:sqlStmt columnIndex:i];
        id columnData = [self columnData:sqlStmt columnIndex:i];
        [dictionary setObject:columnData forKey:columnName];
    }
    [arrayList addObject:[dictionary autorelease]];
}

sqlite3_finalize(sqlStmt);

return arrayList;
}

Как мне это решить?

1 Ответ

2 голосов
/ 04 июля 2011

Нам нужно увидеть код вашего executeQuery метода - он должен возвращать автоматически выпущенный результат, но, возможно, это не так.

Вы можете попробовать;

NSArray *result = [[self executeQuery:sql arguments:argsArray] autorelease];

Но я бы остерегался просто слепой попытки этого, даже не видя того, что executeQuery делает подробно.

РЕДАКТИРОВАТЬ:

ОК, вот вашproblem;

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

Либо создайте его как автоматически освобожденный массив, либо завершите метод с помощью;

return [arrayList autorelease];
...