2011-07-04 4 views
0

다음 Sqlite 코드에서 Instruments에서 메모리 누수가 발생합니다.어떻게 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; 
} 

어떻게 해결할 수 있습니까?

답변

2

executeQuery 코드의 코드를 확인해야합니다. 이 자동 출시 된 결과를 반환해야하지만 실제로는 그렇지 않습니다.

시도해 볼 수 있습니다.

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

하지만 난 그냥 맹목적 것을 시도의 경계 것 실제로 executeQuery 자세히 무엇을 보지 않고.

수정 :

확인 하시겠습니까?

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

자동 해제 배열로 만들거나;

return [arrayList autorelease]; 
+0

편집 내 질문. 'executeQuery' 세부 사항을 위해. – Devang

+0

업데이트 된 답변보기 분명히 이것은 나머지 코드가 executeQuery 결과를 사용하는 방법에 따라 결과가있을 수 있지만 메모리 관리와 일관성이 있다면 괜찮을 것입니다. – Roger

관련 문제