2010-04-23 6 views
1

Я надеюсь, удалить все строки с UITablewViewудалить строки из UITableView вызывает утечку памяти

UITableView является «atableview», ее источником данных является «fileArray».

NSMutableArray * fileArray;

fileArray является NSMutableArray для объекта MYFileObj

#import <UIKit/UIKit.h> 

NSMutableArray *fileArray; 

@interface MYFileObj : NSObject { 

NSString *fileName; 

} 
-(void) setFileName:(NSString *)s ; 
-(NSString *) FileName ; 
@end 

я загрузить fileArray сначала, а затем вызвать [atableview reloadData];

после делать что-то, я надеюсь, чтобы перезагрузить fileArray и перерисовывать atableview, поэтому я называю

-(void) removeACell:(NSInteger)row; 
{         
    NSUInteger _lastSection = 0;//[self numberOfSectionsInTableView:atableview]; 
    NSUInteger _lastRow =row;// [atableview numberOfRowsInSection:_lastSection] - 1; 
    NSUInteger _path[2] = {_lastSection, _lastRow}; 
    NSIndexPath *_indexPath = [[NSIndexPath alloc] initWithIndexes:_path length:2]; 
    NSArray *_indexPaths = [[NSArray alloc] initWithObjects:_indexPath, nil]; 
    [_indexPath release]; 



    [atableview deleteRowsAtIndexPaths:_indexPaths withRowAnimation: UITableViewRowAnimationNone]; 

    [_indexPaths release]; 


} 


-(void) reloadList; 
{ 


if([fileArray count]>0) //----the begining of the codes cause memory leak 
    {     //I hope to remove all rows and reload fileArray 
     NSInteger n=fileArray.count; 
     [atableview beginUpdates]; 

     for(int i=n-1;i>=0;i--) 
     {   
      [fileArray removeObjectAtIndex:i]; 
      [self removeACell:i]; 


     } 
     [fileArray release]; 
     [atableview endUpdates]; 
    }     //----the end of the codes cause memory leak 

//load fileArray again 
[atableview reloadData]; 

} 

Но я нашел эту утечку памяти причины.

Приветствуется любой комментарий.

Благодаря

InterDev

ответ

1

Хотя бывают случаи, когда вы хотите удалить строку или строки вручную, ваш код не кажется, один из тех случаев, потому что вы затем поворачиваясь и вызова reloadData в представлении таблицы.

Когда все меняется в вашей таблице, сначала сделайте изменения в источнике данных резервного копирования - fileArray - и затем вызовите reloadData, и все будет в порядке.

Далее вам не нужно удалять объекты из массива в цикле, если вы полностью опустошаете его: просто используйте [fileArray removeAllObjects]; (на самом деле, поскольку вы освобождаете файлArray после своего цикла, вы можете уменьшить всю эту логику до [releaseArray], и он отправит релиз на каждый из его объектов.

Не знаете, где ваша утечка памяти - есть много кода, который мы не можем видеть, но очистка логики, как описано, поможет вам.

Смежные вопросы