Утечки при добавлении-удалении объектов в MutableArray - PullRequest
0 голосов
/ 20 сентября 2010

у меня утечка памяти в моем приложении.Мое приложение запускается на контроллере таблиц.Я анализирую файл JSON, чтобы заполнить массив.Затем этот массив используется для заполнения ячеек таблицы.Я заполняю свой массив объектами (класс).

Я делаю:

[tab_Demandes removeAllObjects];

for (NSDictionary *demandeD in demandes)

{
    Demande *dem =[[Demande alloc] init];

    dem.demTitle=title;

    dem.demId=Id;

    dem.demCreated=created;

    [tab_Demandes addObject:dem];

    [dem release];
}

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

[tab_Demandes removeAllObjects];

Если я не выполняю [dem release], у меня возникают утечки в инструментах каждый раз, когда я перезагружаю tab_Demandes.RemoveAllObjects работает, но у меня есть утечки.

Спасибо за любую обычную помощь.

Wallou ++

Редактировать: вот где я сделал свои клетки.Возможно, я путаюсь при создании ячеек. Фактически tab_Demandes объявлен в делегате с помощью get / set для доступа к нему из других классов (где я загружаю свой tableviewcontroller).

(UITableViewCell *) tableView: (UITableView *) tableViewcellForRowAtIndexPath: (NSIndexPath *) indexPath {

static NSString *CellIdentifier = @"Cell";

CustomCellViewController *cell = (CustomCellViewController *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
   // NSLog(@"Cell created");
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCellViewController" owner:nil options:nil];

    for(id currentObject in topLevelObjects)
    {
        if([currentObject isKindOfClass:[CustomCellViewController class]])
        {
            cell = (CustomCellViewController *)currentObject;
            break;
        }
    }
}

    // Set up the cell...


    TabsAppDelegate *appDelegate = (TabsAppDelegate*)[[UIApplication sharedApplication] delegate];

    cell.lbl_demId.text=[NSString stringWithFormat:@"%@", [[[appDelegate tab_Demandes] objectAtIndex:indexPath.row ] demId]];
    cell.lbl_demCopro .text=[NSString stringWithFormat:@"%@", [[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demIdCopro ]];
    cell.lbl_demImmeuble.text=[NSString stringWithFormat:@"%@", [[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demIdImmeuble]];
    cell.lbl_demLot.text=[NSString stringWithFormat:@"%@", [[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demIdLot]];
    cell.lbl_demDescriptif.text=[NSString stringWithFormat:@"%@", [[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demTitle]];
    //NSLog(@"statut demande : %@",[[tab_Demandes objectAtIndex:indexPath.row] demStatut]);
    if ([[[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demStatut] isEqualToString: @"Validée"])
    {
    cell.lbl_ImageView.image=[UIImage imageNamed:@"VDEM2.png"];
    }
    if([[[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demStatut] isEqualToString: @"Initiée"])
    {
       cell.lbl_ImageView.image=[UIImage imageNamed:@"IDEM.png"];
    }
    if([[[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demStatut] isEqualToString: @"Terminée"])
    {
    cell.lbl_ImageView.image=[UIImage imageNamed:@"TDEM.png"];
    }
    if([[[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demStatut] isEqualToString: @"En coursée"])
    {
    cell.lbl_ImageView.image=[UIImage imageNamed:@"EDEM.png"];
    }


return cell;    

}

NEW EDIT:

Demandes.h:

@interface Demande : NSObject { 

    NSString *demId;
    NSString *demStatut;
    NSString *demTitle;
    NSString *demCreated;
    NSString *demIdCopro;
    NSString *demIdImmeuble;
    NSString *demIdLot;
    NSString *demDescriptif;
    NSString *demAuteur;
    NSString *demIdAuteur;
    NSString *demLoginAuteur;   
}

@property (retain,nonatomic) NSString *demId;
@property (retain,nonatomic) NSString *demIdCopro;
@property (retain,nonatomic) NSString *demIdImmeuble;
@property (retain,nonatomic) NSString *demIdLot;
@property (retain,nonatomic) NSString *demDescriptif;
@property (retain,nonatomic) NSString *demStatut;
@property (retain,nonatomic) NSString *demTitle;
@property (retain,nonatomic) NSString *demCreated;
@property (retain,nonatomic) NSString *demAuteur;
@property (retain,nonatomic) NSString *demIdAuteur;
@property (retain,nonatomic) NSString *demLoginAuteur;
@end

Demandes.m:

import "Demande.h"
@implementation Demande


@synthesize demId,demIdCopro,demIdImmeuble,demIdLot,demDescriptif,demStatut,demTitle,demCreated,demAuteur,demIdAuteur,demLoginAuteur;


- (void)dealloc {   
    [demId release];
    [demIdCopro release];
    [demId release];
    [demIdImmeuble release];
    [demIdLot release];
    [demDescriptif release];
    [demStatut release];
    [demTitle release];
    [demCreated release];
    [demAuteur release];
    [demIdAuteur release];
    [demLoginAuteur release];
    [super dealloc];
}
@end

1 Ответ

0 голосов
/ 20 сентября 2010

Код выше верен.Интересно, не слишком ли вы освобождаете объекты, которые находятся в вашем массиве (то есть во время метода tableView: cellForRowAtIndexPath).При вызове removeAllObject метод освобождает каждый объект, который он удаляет.Если один объект уже освобожден и освобожден, ваше приложение будет аварийно завершено.

Предложенная оптимизация:

-Убедитесь, что cellIdentifier в наконечнике исправен @ "Cell"

-Заменить

cell.lbl_demId.text=[NSString stringWithFormat:@"%@", [[[appDelegate tab_Demandes] objectAtIndex:indexPath.row ] demId]];

на

Demand* dem = [[[appDelegate tab_Demandes] objectAtIndex:indexPath.row ];
cell.lbl_demId.text=[NSString stringWithFormat:@"%@", [dem demId]];

, чтобы избежать слишком большого количества запросов к массиву.

-Не допускайте помещения вашей модели в appDelegate.и вместо этого создайте объект модели синглтона.Это распространенная ошибка проектирования новичка, связанная с тем, что appDelegate - это простой объект для настройки и доступа, позволяющий избежать передачи модели всем объектам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...