2

私はwhを理解しようとしてきました。sqyこの関数を呼び出すたびに、オブジェクトの割り当てが厳密に保たれます。Instrumentsはリークを報告しませんが、大量のオブジェクトが

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

& from

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

ここに投稿された提案に従って解決しようとしました:http ://www.iphonedevsdk.com/forum/iphone-sdk-development/7092-sqlite3-database-gobbling-up-memory.htmlが、修正できませんでしたそれ

どんな助けでもありがたいです、私のコードは以下にあります

+(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].sortedBy==@"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];
}
4

2 に答える 2

3

ループサイクルごとにdbを開いているようですが、関数が終了する前に一度だけ閉じます

だから変更してみてください:

    }   
sqlite3_close(デシベル);
[localPool リリース];
}

 
       sqlite3_close(デシベル);
   }   

[localPool リリース];
}

またはさらに良い変更:

for(int i=0;i [[DT sharedDT].typesInLibrary カウント];i++)
{   

 if(sqlite3_open([databasePath UTF8String], &db)==SQLITE_OK)
 {
     if (sqlite3_exec(db, "PRAGMA CACHE_SIZE=50;", NULL, NULL, NULL) != SQLITE_OK) {
         NSAssert1(0, @"エラー: メッセージ '%s' でキャッシュ サイズを設定できませんでした。", sqlite3_errmsg(db));
     }

に:

if(sqlite3_open([databasePath UTF8String], &db)==SQLITE_OK)
{
    if (sqlite3_exec(db, "PRAGMA CACHE_SIZE=50;", NULL, NULL, NULL) != SQLITE_OK) {
         NSAssert1(0, @"エラー: メッセージ '%s' でキャッシュ サイズを設定できませんでした。", sqlite3_errmsg(db));     
    }

    for(int i=0;i [[DT sharedDT].typesInLibrary カウント];i++)
    {   
    ...

常に同じデータベースを開いているため

于 2009-06-13T06:56:12.067 に答える
0

次のコマンドで sqlite3_exec を呼び出してみてください:

pragma cache_size=1 

Sqlite はキャッシングのためにメモリをむさぼり食うようです。

于 2009-06-13T07:01:49.167 に答える