开发者

How to solve Memory leaks for following Sqlite code?

I am getting memory leaks in Instruments in the following Sqlite Code.

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

It calls following method.

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

s开发者_JS百科qlite3_finalize(sqlStmt);

return arrayList;
}

How do I solve it ?


We'd need to see the code of your executeQuery method - it should be returning an auto-released result, but perhaps it isn't.

You could try ;

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

But I'd be wary of just blindly trying that without actually seeing what executeQuery does in detail.

EDIT:

OK, here's your problem;

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

Either create it as an auto-released array, or finish the method with;

return [arrayList autorelease];
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜