Iphone iPad应用程序内存增加(泄漏)

Iphone iPad应用程序内存增加(泄漏),iphone,ios,ipad,sqlite,memory-leaks,Iphone,Ios,Ipad,Sqlite,Memory Leaks,我的代码运行时出现内存问题。 我的设备的RAM不断增加,但从未减少。我不明白为什么 供您参考,我的代码中有一部分循环了大约7000次。(我已经尝试过将这个循环拆分为几个较小的循环,但没有效果) 在这个循环中,我解析一个XML文件,然后在sqlite数据库中添加一些解析的信息。 为了杀死我的对象,我使用了下面的块:“@autoreleasepool”。它限制了RAM的使用,但不足以减少内存 这里的问题不是我的7000次迭代;它们很好用。但如果我以后再尝试迭代一些,那么内存就会饱和,iOS会杀死我的

我的代码运行时出现内存问题。 我的设备的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];
}

提前感谢您的考虑。

尝试使用Xcode的产品->配置文件菜单选项,并选择“分配”作为要创建的视图类型。这将让您看到创建了什么类型的对象和内存块,还可以让您看到保留和释放它们的事件序列。您是否通过静态分析器(“产品”-“分析”或shift+命令+B)运行了此操作?这会发现许多手动内存管理问题。也可用于查找泄漏源。您不会自动释放任何内容。那么,使用@autoreleasepool块有什么意义呢?我一直在使用Analyze进行主要检查泄漏,他们在我的代码中对这种类型的泄漏没有问题。你说得对,Hermann这是以前的版本,但现在它没有真正的用处