2014-01-17 2 views
0

아이폰의 도구 파일에 sqlite3Memmalloc 누출이 있습니다. 내 응용 프로그램이 200MB 이상의 메모리를 소비하고 있습니다. 메모리 관리 도구에서 책임 라이브러리를 libsqlite3.dylib로 표시합니다. & 책임있는 호출자는 sqlite3MemMalloc입니다. 내 응용 프로그램에서 2000 rows.I 삽입하려고 메모리 사용량으로 인해 응용 프로그램이 추락 가져옵니다 생각합니다. 모든 측면을 검사했지만 내 sqlite 코드에서 오류 누출을 찾을 수 없습니다. 제게 해결책을 제공해주세요. 아래 내 sqlite 코드입니다.아이폰 앱의 메모리 누수 sqlite3MemMalloc

- (Boolean) insertQuotes:(QuotesInfo*)quote 
    { 

NSString *dbPath = [dBManager GetConnectToDatabase]; 
sqlite3_stmt *selectstmt=nil; 
if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) 
{ 
    if(selectstmt == nil) 
    { 

     NSString* Query=[NSString stringWithFormat:@"insert into Quotes (QuoteID,QuoteDate,QuoteDesc,QuoteAuthor,QuoteCategory,QuoteCategoryID,QuoteAuthorID,QuoteFavourite,QuoteCategoryFilterStatus,QuoteAuthorFilterStatus,AuthorFirstName,AuthorLastName) values (%d, '%@', %@, '%@', '%@', %d, %d, %d, %d, %d, '%@', '%@')",quote.quoteId,quote.quoteDate,quote.quoteDesc,quote.quoteAuthor,quote.quoteCategory,quote.quoteCategoryID,quote.quoteAuthorID,quote.quoteFav,quote.quoteCategoryFilterStatus,quote.quoteAuthorFilterStatus,quote.authorFirstName,quote.authorLastName]; 

     NSLog(@"Query %@",Query); 
     const char *sql = [Query UTF8String]; 

     if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) != SQLITE_OK) 
     { 
      NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database)); 
     } 
    } 
    @try { 

    } 
    @catch (NSException * e) { 

     return NO; 

     NSLog(@"INSERT EXCEPTION %@",e); 
     //Handle the Exception here.. 
    } 

    if(SQLITE_DONE != sqlite3_step(selectstmt)){ 
     NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 
    } 
    else{ 
     sqlite3_reset(selectstmt); 
     sqlite3_finalize(selectstmt); 
     sqlite3_close(database); 
     return YES; 
     } 
    } 
    return NO; 
} 

답변

2

이 그 코드에 끔찍한 버그를 많이하지만, 메모리 누수와 관련된 것들이다 :

  • 당신은 항상 sqlite3_prepare_v2sqlite3_finalize이 성공 호출하지 않습니다;
  • sqlite3_open 성공 후 항상 sqlite3_close을 호출하는 것은 아닙니다.

if/else 분기에서 해당 통화를 숨기면 안됩니다. 코드가 항상 호출되도록 코드를 다시 구성하십시오.