2009-09-24 179 views
0

即时通讯存在泄漏内存问题。乐器显示线“pagamento_”是一个malloc。我没有想法如何解决这个问题。内存泄漏 - iPhone

我有以下代码:* 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

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

return [[dados copy] autorelease];

+0

但是当我这样做,我的应用程序出口=/ – Helena 2009-09-24 17:09:23

1

你几乎肯定要返回[[dados copy] autorelease]。仅仅返回复制结果通常会在Cocoa memory management rules下发生内存泄漏。

+0

感谢anwser ...但是当我这样做,我的应用程序退出.... – Helena 2009-09-24 17:09:58

+1

然后它听起来像你有另一个错误。 – Chuck 2009-09-24 17:31:42

+0

是的查克...非常感谢你 – Helena 2009-09-24 18:07:29

0

尝试使用LLVM锵静态分析,详见this link

+0

非常感谢你! – Helena 2009-09-24 18:05:37

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。毫无疑问,它会更快,并为您节省大量开发时间。

+0

非常感谢你......我需要在代码的另一部分保留一个位置来工作:) – Helena 2009-09-24 18:06:58