2009-09-24 178 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