コードの実行中にメモリの問題が発生しました。私のデバイスのRAMは、減少することなく、絶えず増加しています。理由がわかりません。
参考までに、コードには約7000回ループする部分があります。(私はすでにこのループをいくつかの小さなループに分割しようとしましたが、効果はありませんでした)このループ中に、XMLファイルを解析し、解析された情報の一部をsqliteデータベースに追加します。オブジェクトを強制終了するために、次のブロックを使用しました:"@autoreleasepool"。RAMの使用量は制限されますが、メモリを減らすには不十分です。
ここでの問題は、私の7000回の反復ではありません。それらはうまく機能します。しかし、後でもう少し反復しようとすると、メモリが飽和状態になり、iOSがアプリを強制終了します。コードの何が問題になっているのかを理解するには、さらに情報が必要です。
これが私が使用したコード部分です:
-(void)MultiInsertFamille:(NSArray *)familles
{
NSMutableArray *produits = [[NSMutableArray alloc] init];
NSMutableArray *famillesRetry = [[NSMutableArray alloc] init];
sqlite3_stmt *stmt=nil;
sqlite3 *bdd;
NSString *database = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"mybdd.sqlite"];
if (sqlite3_open([database UTF8String], &bdd) == SQLITE_OK)
{
sqlite3_exec(bdd, "BEGIN", 0, 0, 0);
const char *sqlstatement="insert into Famille values(?,?,?,?,?,?,?)";
if(sqlite3_prepare_v2(bdd,sqlstatement , -1, &stmt, NULL)==SQLITE_OK)
{
int hasError= 0;
for(NSString *path in familles)
{
@autoreleasepool
{
XMLParserFamille *fa = [[XMLParserFamille alloc] initXMLParserFamille:path parseError:nil];
for (ProduitData *p in fa.famille.Produits.Produit)
{
[produits addObject:p];
}
FamilleData *fam = [fa.famille retain];
[fa release];
if (fam.champ_Recherche)
sqlite3_bind_text(stmt, 1, [fam.champ_Recherche cStringUsingEncoding:NSUTF8StringEncoding], -1, SQLITE_TRANSIENT);
else
sqlite3_bind_text(stmt, 1, "NULL", -1, SQLITE_TRANSIENT);
NSString *pathImTh = @"";
for (Attribut *att in fam.Attributs)
{
if ([att.name isEqualToString:@"ProductThumbnail"])
{
pathImTh = att.value;
break;
}
}
if (![pathImTh isEqualToString:@""])
sqlite3_bind_text(stmt, 2, [pathImTh cStringUsingEncoding:NSUTF8StringEncoding], -1, SQLITE_TRANSIENT);
else
sqlite3_bind_text(stmt, 2, "NULL", -1, SQLITE_TRANSIENT);
if (fam.nom)
sqlite3_bind_text(stmt, 3, [fam.nom cStringUsingEncoding:NSUTF8StringEncoding], -1, SQLITE_TRANSIENT);
else
sqlite3_bind_text(stmt, 3, "NULL", -1, SQLITE_TRANSIENT);
if (fam.ordre)
sqlite3_bind_int(stmt, 4, [fam.ordre intValue]);
else
sqlite3_bind_int(stmt, 4, 0);
if (fam.uid)
sqlite3_bind_text(stmt, 5, [fam.uid cStringUsingEncoding:NSUTF8StringEncoding], -1, SQLITE_TRANSIENT);
else
sqlite3_bind_text(stmt, 5, "NULL", -1, SQLITE_TRANSIENT);
if (fam.uid_Categorie)
sqlite3_bind_text(stmt, 6, [fam.uid_Categorie cStringUsingEncoding:NSUTF8StringEncoding], -1, SQLITE_TRANSIENT);
else
sqlite3_bind_text(stmt, 6, "NULL", -1, SQLITE_TRANSIENT);
if (fam.xmlErrone)
sqlite3_bind_int(stmt, 7, [fam.xmlErrone intValue]);
else
sqlite3_bind_int(stmt, 7, 0);
if(sqlite3_step(stmt)==SQLITE_DONE)
{
NSLog(@"OK FAMILLE");
}
else
{
[famillesRetry addObject:fam.uid];
NSLog(@"sqlite3_step error famille: '%s'", sqlite3_errmsg(bdd));
hasError= 1;
}
[fam release];
sqlite3_reset(stmt);
}
}
if( hasError == 0 ) {
sqlite3_exec(bdd, "COMMIT", 0, 0, 0);
}
else {
sqlite3_exec(bdd, "ROLLBACK", 0, 0, 0);
}
}
sqlite3_finalize(stmt);
}
sqlite3_close(bdd);
if (famillesRetry.count > 0)
[self retryFamille:famillesRetry familleToInsert:familles];
[famillesRetry release];
[self MultiInsertProduit:produits];
[produits release];
}
よろしくお願いします。