2009-09-24 3 views
0

J'ai des problèmes de mémoire de fuite. Les instruments montrent la ligne "pagamento_" est un malloc. Je n'ai pas idée comment résoudre ceci.Memory Leak - iPhone

J'ai le code suivant: * dados est NSMutableArray, et im alloc dans un autre endroit ... et de libérer dans dealloc.

NSString * chemin = [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]; 

quelqu'un sait comment je résous cela ?? grâce

Répondre

1

Vous êtes en train libérant correctement pagamento_ après l'avoir ajouté au tableau dados, mais vous retournez une copie de dados de cette méthode. C'est probablement une erreur. À moins que l'appelant de cette méthode ne sache libérer ce tableau, il y aura fuite, provoquant la fuite de l'objet pagamento_. Vous devriez probablement faire ceci:

return [[dados copy] autorelease];

+0

mais quand je fais cela, mon application exit =/ – Helena

1

Vous voulez certainement revenir [[dados copy] autorelease]. Juste retourner le résultat de la copie sera normalement une fuite de mémoire sous le Cocoa memory management rules.

+0

grâce à anwser ... mais quand je fais cela, mon application quitte .... – Helena

+1

Ensuite, il semble que vous ayez une autre erreur. – Chuck

+0

oui chuck ... merci beaucoup – Helena

0

Essayez d'utiliser l'analyseur statique Clang LLVM, pour plus de détails voir this link

+0

Merci beaucoup! – Helena

3
return [dados copy]; 

Cela provoque une fuite puisque vous n'êtes pas délier la tableau original. Depuis Dados est un NSMutbaleArray qui est, en théorie, attribué dans votre -init et publié dans votre -dealloc, copie Dados sur le retour du code ci-dessus est une bonne idée, mais vous devez utiliser:

return [[dados copy] autorelease]; 

Si votre l'application plante quand vous venez de retourner dados (ou quand vous faites ce qui précède), c'est parce que vous ne gérez pas la mémoire correctement. Comme suggéré par Ram, utilisez l'analyseur statique et corrigez les problèmes qu'il identifie en premier (compilez et analysez dans Xcode sur Snow Leopard).

Si votre application reste se bloque, puis activer NSZombies (google peut vous montrer comment) et voir si cela l'attrape.

À moins que vous ne deviez cibler iPhone OS 2.x ou que vous ayez vraiment besoin de le faire, vous devriez utiliser Core Data au lieu de SQLite. Il sera sans doute plus rapide et vous fera gagner un temps de développement important.

+0

merci beaucoup ... J'avais besoin de conserver une place dans une autre partie du code pour travailler :) – Helena

Questions connexes