2 votes

L'affectation d'un objet autorelease à un bien conservé augmente-t-elle son nombre de conservations ?

J'aurais pensé que 'self.data=' conserverait les objets NSMutableArray autorelease et les objets NSMutableDictionary qu'ils contiennent, mais j'obtiens finalement EXC_BAD_ACCESS lorsque la méthode cellForRowAtIndexPath de la table tente d'accéder aux NSDictionaries dans self.data.

@property (strong, nonatomic) NSMutableArray *data;

- (void) updateReceivedData:(NSData *) jsonData
{
    NSMutableArray *fetchedData = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
        self.data = [self convertDates:fetchedData withFormat:kMySQLDateTimeFormat];
        [self.tableView reloadData];
    }
}

- (NSMutableArray*) convertDates:(NSMutableArray *) array withFormat:(NSString *) format
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:format];
    NSMutableArray *newArray = [NSMutableArray arrayWithArray:array];
    for (NSMutableDictionary *dict in newArray)
    {
        for (id key in dict.allKeys)
        {
            if ([[dict objectForKey:key] isKindOfClass:[NSString class]])
            {
                NSString *value = [dict objectForKey:key];
                NSDate *date = [dateFormatter dateFromString:value];
                if (date) [dict setObject:date forKey:key];
            }
        }
    }
    [dateFormatter release];
    return newArray;
}

BAD_ACCESS ICI jeté ici entre les NSLogs.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"cell";
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

   if (cell == nil) {
       NSLog (@"Cell was nil");
       cell = [[[CustomCell alloc] init] autorelease];
   }

    NSDictionary *dict = [[NSDictionary alloc] init];
    if (_isFiltered){
        dict = [self.filteredData objectAtIndex:indexPath.row];
    } else {
        dict = [self.data objectAtIndex:indexPath.row];
    }
    NSLog (@"Filling Label 1");
    cell.IDLabel.text = [[dict objectForKey:@"Id"] stringValue];
    NSLog (@"Filling Label 2");
    cell.firstNameLabel.text = [dict objectForKey:@"firstName"];
    [dict release];
    return cell;
}

5voto

bbum Points 124887

Activez les zombies et voyez si le problème est détecté (EXC_BAD_ACCESS ne signifie pas nécessairement qu'un objet a été libéré de manière excessive, mais c'est possible).

Ce qui arrive à la valeur absolue du nombre de conservations d'un objet n'est pas pertinent.

Cependant, un strong implique que l'objet est conservé, oui, si vous assignez à travers le setter (i.e. self.data = ... et non _data = ...).

2voto

nkongara Points 932

Pourquoi libérez-vous le dict dans cellForRowAtIndexPath : . Même si vous allouez le dict, vous assignez un autre pointeur qui est un objet de filteredData ou data. Supprimez simplement la [libération de données] et lorsque vous déclarez data, assignez-le comme nil.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"cell";
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

   if (cell == nil) {
       NSLog (@"Cell was nil");
       cell = [[[CustomCell alloc] init] autorelease];
   }

    // **As you will be assigning the object from filteredData/data, don't allocate here**
    NSDictionary *dict = nil;
    if (_isFiltered){
        dict = [self.filteredData objectAtIndex:indexPath.row];
    } else {
        dict = [self.data objectAtIndex:indexPath.row];
    }
    NSLog (@"Filling Label 1");
    cell.IDLabel.text = [[dict objectForKey:@"Id"] stringValue];
    NSLog (@"Filling Label 2");
    cell.firstNameLabel.text = [dict objectForKey:@"firstName"];
    // **Release not required as you didn't allocate**
    //[dict release];
    return cell;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X