内存泄漏 - iPhone

Posted

技术标签:

【中文标题】内存泄漏 - iPhone【英文标题】:Memory Leak - iPhone 【发布时间】:2009-09-24 16:47:35 【问题描述】:

我遇到了内存泄漏问题。仪器显示行“pagamento_”是一个malloc。我不知道如何解决这个问题。

我有以下代码: * dados 是 NSMutableArray,我在其他地方分配...并在 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];

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

【问题讨论】:

【参考方案1】:
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。它无疑会更快,并为您节省大量的开发时间。

【讨论】:

非常感谢...我需要在代码的另一部分保留一个位置才能工作:)【参考方案2】:

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

return [[dados copy] autorelease];

【讨论】:

但是当我这样做时,我的应用程序退出 =/【参考方案3】:

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

【讨论】:

【参考方案4】:

尝试使用 LLVM Clang 静态分析器,详情请参阅 this link

【讨论】:

以上是关于内存泄漏 - iPhone的主要内容,如果未能解决你的问题,请参考以下文章

iphone内存泄漏教程

iPhone 内存泄漏与商店套件

iPhone/iPad 应用程序内存泄漏

iPhone 内存泄漏工具

内存泄漏 - iPhone

如何解决 xcode(仪器)中的 iPhone 应用程序内存泄漏