【问题标题】:"-[__NSCFArray removeObjectAtIndex:]: mutating method sent to immutable object" error“-[__NSCFArray removeObjectAtIndex:]:变异方法发送到不可变对象”错误
【发布时间】:2014-01-17 18:52:14
【问题描述】:

我有一个静态的 NSMutableArray,这个数组是我的表格视图的数据源。然后我从表格视图中删除了一个单元格,它崩溃了。

这里是我创建数组的地方:

static NSMutableArray *listaPiscinas;

我的代码:

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

        [listaPiscinas removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
        [TratamentoView setListaPiscinas:listaPiscinas];
        NSString *URLdeletarPiscina = [[NSString alloc] initWithFormat:@"%@app/excluir_piscina.php?cod_cliente_piscina=%@", URL_CADASTRO, [[listaPiscinas objectAtIndex:indexPath.row] objectForKey:@"cod_cliente_piscina"]];
        dataReciever = [[AsyncDownloader alloc] initWithGetAdress:URLdeletarPiscina delegate:self];

        [tableView reloadData];
    }
}

【问题讨论】:

  • 顺便说一句:你为​​什么以及在哪里定义listaPiscinas static?
  • 是的,您没有可变数组。声明一个静态变量通常是你迷路的标志。

标签: ios objective-c cocoa-touch nsmutablearray


【解决方案1】:

虽然您的变量类型为 NSMutableArray,但分配给它的对象是 NSArray,无法更改。
为了进一步帮助您向我们展示创建listaPiscinas 的代码。

【讨论】:

【解决方案2】:

要清楚,您发布的第一行:

static NSMutableArray *listaPiscinas;

是您声明数组的位置,而不是创建数组的位置。

该行定义了一个可以指向对象的指针变量。但是它不会创建对象。

您尚未发布创建数组的代码。

如果你有这样的代码:

listaPiscinas = [NSArray arrayWithObjects: @"one", @"two", @"three", nil];

然后,您将创建一个不可变数组并将指向该不可变数组对象的指针保存到应该指向可变数组的指针变量中。编译器会给你一个警告,但是如果你忽略这个警告,那么你的 listaPiscinas 将指向一个不可变的数组,尝试修改这个数组会使你的程序崩溃,就像你报告的错误一样。

发布创建对象并将其保存到您的 listaPiscinas 静态变量的代码。

顺便说一句,静态变量通常是个坏主意。只有少数情况下您应该使用它们。您很可能应该使用实例变量或属性。

【讨论】:

  • 它来自另一个类的另一个 NSMutableArray,它使用静态方法将内容获取到 listaPiscinas:+ (void)setListaPiscinas:(NSMutableArray*)lista{ listaPiscinas = lista; }
  • 除非很明显你错了,你分配的对象不是一个可变数组。如果我们看不到该代码以及创建数组的其他类中的代码,我们将无法帮助您解决问题。 “魔鬼藏在细节中”这句话在这里适用。
  • 我认为这解决了问题: NSMutableArray *listaTemp = [listaPiscinas mutableCopy]; [listaTemp removeObjectAtIndex:indexPath.row]; listaPiscinas = listaTemp;
  • 当然,通过制作可变副本来转换传入数组是解决问题的有效方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 2016-11-17
相关资源
最近更新 更多