Search code examples
objective-cxcode4ios5exc-bad-access

NSMutableArray and UITableVIew ( exc_bad_access)


I have object "Consumo"

-(id)initWithDictionary:(NSDictionary *)consumo{
    self = [super init];

    if (self != nil)
    {
        fechaLectura = [consumo objectForKey:@"fechaLectura"];
        tarifa = [consumo objectForKey:@"tarifa"];
        consumoBase = [consumo objectForKey:@"consumoBase"];
        consumoHP = [consumo objectForKey:@"consumoHP"];
        reactivoLeido = [consumo objectForKey:@"reactivoLeido"];
        reactivoFacturado = [consumo objectForKey:@"reactivoFacturado"];
        demandaFPLeida = [consumo objectForKey:@"demandaFPLeida"];
        demandaFPFacturada = [consumo objectForKey:@"demandaFPFacturada"];
        demandaHPLeida = [consumo objectForKey:@"demandaHPLeida"];
        demandaHPFacturada = [consumo objectForKey:@"demandaHPFacturada"];
        calificacion = [consumo objectForKey:@"consumo"];
    }
    return self;
}

viewController.h

   @interface ConsumoViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>  {
    IBOutlet UILabel * sumLabel;
    NSMutableArray * consumos;
    IBOutlet UITableView *tablaConsumo;
    NSMutableArray * titulosConsumo;
    Consumo * cons;
}

@property (nonatomic,retain) IBOutlet UILabel * sumLabel; 
@property (nonatomic,retain) NSMutableArray * consumos;
@property (nonatomic,retain) UITableView * tablaConsumo;
@property (nonatomic,retain) NSMutableArray * titulosConsumo;
@property (nonatomic,retain) Consumo * cons;
@end

viewcontroller.m ( include tableview )

- (void)viewDidLoad
{
        consumos = [[NSMutableArray alloc] init];
        NSDictionary * dict;

        for (int i = 0; i < [suministro count]; i++){ /* suministro = array to dictionary */

            dict=[suministro objectAtIndex:i];
            cons = [[Consumo alloc] initWithDictionary:dict];
            [consumos insertObject:cons atIndex:i];
        }

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   static NSString *CellIdentifier = @"Cell";
   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
   if (cell == nil) {
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];

 detFechaLectura = [[[UILabel alloc] initWithFrame:CGRectMake(10.0, 20.0, 120.0, 20.0)] autorelease];
        detFechaLectura.tag = LABELSUP1;
[cell.contentView addSubview:detFechaLectura];
}else{
  detFechaLectura = (UILabel *)[cell.contentView viewWithTag:LABELSUP1];
}

 detFechaLectura.text = [[consumos objectAtIndex:indexPath.row] fechaLectura];

 return cell

}

}

Problem:

detFechaLectura.text = [[consumos objectAtIndex:indexPath.row] fechaLectura]; ( Thread 1: Program received signal : "EXC_BAD_ACCESS")

I hope I can help. thanks


Solution

  • It's to do with memory management. You need to retain the objects from your dictionary in your init method :

    fechaLectura = [[consumo objectForKey:@"fechaLectura"] retain];
    

    If your property is set to retain then you must use self. to access it like this :

    self.fechaLectura = [consumo objectForKey:@"fechaLectura"];