内存泄漏 - iPhone

时间:2009-09-24 16:47:35

标签: iphone objective-c memory-leaks

我有泄漏记忆问题。仪器显示行“pagamento_”是malloc。我不知道如何解决这个问题。

我有以下代码:* dados是NSMutableArray,并且im alloc在其他地方......并且在dealloc中发布。

NSString * path = [self caminho];

if (sqlite3_open([path UTF8String], &Banco) == SQLITE_OK){

    if (sqlite3_prepare_v2(Banco, [sql UTF8String], -1, &stmt, NULL) == SQLITE_OK) {


        int row = sqlite3_step(stmt);
        while(row == SQLITE_ROW) {
                            ...

                           if([tabela isEqual:@"Pagamento"]){

                pagamento_ = [[Pagamento alloc]init];

                pagamento_.codigo = sqlite3_column_int(stmt, 0);
                pagamento_.codNomePgto = sqlite3_column_int(stmt, 1);
                pagamento_.codCategoria = sqlite3_column_int(stmt, 2);
                pagamento_.vencimento = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 3)];
                pagamento_.repeticaoPagamento = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 4)];
                pagamento_.dataTermino = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 5)];
                pagamento_.vctoFDS = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 6)];
                pagamento_.valorPrevisto = [NSString stringWithFormat:@"%4.2f",sqlite3_column_double(stmt, 7)];
                pagamento_.valorPago = [NSString stringWithFormat:@"%4.2f",sqlite3_column_double(stmt, 8)];
                pagamento_.dataPgto = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 9)];
                pagamento_.anotacoes =[NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 10)];
                pagamento_.debitoAutomatico = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 11)];
                pagamento_.nome = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 12)];
                pagamento_.numSerie = sqlite3_column_int(stmt, 13);
                pagamento_.codFavorecido = sqlite3_column_int(stmt, 14);
                pagamento_.favorecido =[NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 15)];
                pagamento_.valor = [NSString stringWithFormat:@"%4.2f",sqlite3_column_double(stmt, 16)];

                [dados addObject:pagamento_];

                [pagamento_ release];

            }

                     row = sqlite3_step(stmt);

        }

sqlite3_finalize(stmt);
sqlite3_close(Banco); 

return [dados copy];

有谁知道我如何解决这个问题? 谢谢

4 个答案:

答案 0 :(得分:3)

return [dados copy];

由于您没有释放原始数组,因此导致泄漏。由于dados是一个NSMutbaleArray,理论上是在你的-init中分配并在你的-dealloc中发布的,从上面的代码返回复制dados是个好主意,但你应该使用:

return [[dados copy] autorelease];

如果您刚刚返回dados时(或者当您执行上述操作时)应用程序崩溃,那是因为您没有正确管理内存。正如Ram所建议的,使用静态分析器并修复它首先识别的任何问题(在Snow Leopard的Xcode中构建和分析)。

如果你的应用仍然崩溃,那么打开NSZombies(谷歌可以告诉你如何),看看是否能抓住它。

除非你需要定位iPhone OS 2.x或者真的需要这么做,否则你应该使用Core Data而不是SQLite。毫无疑问,它会更快,并为您节省大量的开发时间。

答案 1 :(得分:1)

pagamento_添加到dados数组后,您正在正确发布,但是您正在从此方法返回dados的副本。这很可能是一个错误。除非此方法的调用者知道释放该数组,否则它将被泄露,导致pagamento_对象也被泄露。你可能应该这样做:

return [[dados copy] autorelease];

答案 2 :(得分:1)

您几乎肯定想要返回[[dados copy] autorelease]。只返回复制结果通常是Cocoa memory management rules下的内存泄漏。

答案 3 :(得分:0)

尝试使用LLVM Clang Static分析器,有关详细信息,请参阅this link