从NSMutableDictionary中删除对象时出现EXC_BAD_ACCESS错误

时间:2011-07-01 04:04:06

标签: objective-c ios cocoa-touch

我有一个NSMutableDictionary作为我的UITableView的数据源。我正在尝试实现删除模式并遇到问题。

我正在记录我要删除的密钥以及它对应的对象,因为这个问题似乎可能与我尝试访问未分配的内存或其他内容有关。这是我的tableView实现:commitEditionStyle:forRowAtIndexPath:

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source.
        NSArray * keys = [userList allKeys];
        NSNumber *keyToRemove = [keys objectAtIndex:indexPath.row];
        NSLog(@"Key to remove: %@",keyToRemove);
        NSLog(@"Object at key: %@",[userList objectForKey:keyToRemove]);
           [userList removeObjectForKey:keyToRemove];   
              [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [keys release];
        [keyToRemove release];

    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
    }   
}

此方法运行然后我收到错误。两个NSLog语句输出正确的密钥及其对应的值。

有人能告诉我我做错了吗?

由于

2 个答案:

答案 0 :(得分:3)

您不拥有keyskeysToRemove,因此您不应该发布它们。我强烈建议您阅读Cocoa memory management rules

答案 1 :(得分:1)

这是你的问题:

[keys release];
[keyToRemove release];

您正在释放密钥和keyToRemove,即使您从未分配过它,保留它或复制它,因此它的引用计数正在下降超过应有的数量。

作为一般规则,如果您调用alloc,保留(不是初始化,抱歉)或复制它,您应该只释放一个对象,我建议您在此处阅读引用计数:{{3 }}