2009-06-13 10 views
2

ich habe versucht, wh herauszufinden. SQY meine Objektzuordnung hält jedes Mal, wenn ich diese Funktion aufrufen Rigth up, berichtet Instruments keine Lecks, aber ich bekomme ein verdammt viel von Objekt aus Richtungiphone sqlite3 objektzuweisung speicher auf aber keine leckstellen

sqlite3_exec --> sqlite3Prepare --> sqlite3Parser --> yy_reduce --> malloc & also a whole bunch from 

& from 

sqlite3Step --> sqlite3VdbeExec --> sqlite3BtreeInsert --> malloc 

ich es versucht zu lösen, indem Sie die Vorschläge hier gepostet: http://www.iphonedevsdk.com/forum/iphone-sdk-development/7092-sqlite3-database-gobbling-up-memory.html aber nicht in der Lage gewesen, es zu beheben

jede Hilfe dankbar ist, ist mein Code unten

+(void)getDesignationsInLibrary:(NSString *)library 
{ 
NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];  
NSString *dbName = @"s8.sqlite"; 



NSArray *documentPaths = \ 
NSSearchPathForDirectoriesInDomains \ 
(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDir = \ 
[documentPaths objectAtIndex:0]; 
NSString *databasePath = \ 
[documentsDir stringByAppendingPathComponent:dbName]; 

[[DT sharedDT].designationsInLibrary removeAllObjects]; 

NSString *sqlString; 

for(int i=0;i<[[DT sharedDT].typesInLibrary count];i++) 
{ 

if(sqlite3_open([databasePath UTF8String], &db)==SQLITE_OK) 
{ 
    if (sqlite3_exec(db, "PRAGMA CACHE_SIZE=50;", NULL, NULL, NULL) != SQLITE_OK) { 
     NSAssert1(0, @"Error: failed to set cache size with message '%s'.", sqlite3_errmsg(db)); 
    } 
    NSMutableString *lib=[NSMutableString stringWithString:library]; 

    [lib appendString:@"-"]; 
    [lib appendString:[[DT sharedDT].typesInLibrary objectAtIndex:i]]; 

    if([DT sharedDT][email protected]"AISC Default") 
    { 
     sqlString = [NSString stringWithFormat:@"select DESIGNATION from \"%@\";",lib]; 
    } 
    else 
    { 
     sqlString = [NSString stringWithFormat:@"select DESIGNATION from \"%@\" order by cast(%@ as numeric) %@;",lib, [DT sharedDT].sortedBy, [DT sharedDT].sortAscDesc]; 
    } 

    const char *sql = [sqlString cStringUsingEncoding:NSASCIIStringEncoding]; 
    sqlite3_stmt *selectstmt; 

    if(sqlite3_prepare_v2(db,sql,-1,&selectstmt, NULL)==SQLITE_OK) 
    { 
      while(sqlite3_step(selectstmt)==SQLITE_ROW) 
      { 
       [[DT sharedDT].designationsInLibrary addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt,0)]]; 
      } 
      sqlite3_finalize(selectstmt); 
     selectstmt=nil; 
    } 
} 

} 
sqlite3_close(db); 
[localPool release]; 
} 

Antwort

3

es scheint, dass Sie db auf jedem Schleifendurchlauf sind zu öffnen, aber in der Nähe nur einmal, bevor Funktion Ausgang

versuchen So zu ändern:

 
    } 
sqlite3_close(db); 
[localPool release]; 
} 

zu

 
     sqlite3_close(db); 
    } 

[localPool release]; 
} 

Oder noch besser Änderung:

 
for(int i=0;i [[DT sharedDT].typesInLibrary count];i++) 
{ 

if(sqlite3_open([databasePath UTF8String], &db)==SQLITE_OK) 
{ 
    if (sqlite3_exec(db, "PRAGMA CACHE_SIZE=50;", NULL, NULL, NULL) != SQLITE_OK) { 
     NSAssert1(0, @"Error: failed to set cache size with message '%s'.", sqlite3_errmsg(db)); 
    }

zu:

 

if(sqlite3_open([databasePath UTF8String], &db)==SQLITE_OK) 
{ 
    if (sqlite3_exec(db, "PRAGMA CACHE_SIZE=50;", NULL, NULL, NULL) != SQLITE_OK) { 
     NSAssert1(0, @"Error: failed to set cache size with message '%s'.", sqlite3_errmsg(db));  
    } 

    for(int i=0;i [[DT sharedDT].typesInLibrary count];i++) 
    { 
    ... 

sein führen, dass Sie immer die gleiche Datenbank

+0

Einverstanden. Das Öffnen der Datenbank bei jedem einzelnen Loop-Durchlauf ist eine sehr schlechte Idee. –

0

öffnen sind Aufrufen sqlite3_exec Versuchen mit:

pragma cache_size=1 

SQLite scheint Speicher für das Caching zu verschlingen.

+0

Ich stimme zu, sah dieses Verhalten auch in meiner App. sqlite benötigt viel Speicher für das Caching. Das Schließen der Datenbank und das erneute Öffnen in didReceiveMemoryWarning scheint jedoch zu funktionieren – lostInTransit