【问题标题】:NSMutableArray removeObjectAtIndex crashes on second executionNSMutableArray removeObjectAtIndex 在第二次执行时崩溃
【发布时间】:2012-11-02 15:33:33
【问题描述】:

我有一个表格视图,其中包含许多我希望能够删除的行。填充 tableview 的数据存储在 NSMutableArray 中。要删除我调用的一行数据:

- (void)deleteFromArray:(NSUInteger) number{
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];  //load NSUserDefaults
    NSMutableArray *storedArray = [[ NSMutableArray alloc] init];
    storedArray = [prefs objectForKey: @"mydata"];
    [storedArray removeObjectAtIndex:number];

    [prefs setObject:storedArray forKey:@"mydata"];
    [storedArray release];
    [prefs synchronize];

}

来自

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        subscribe *subscribeclass = [subscribe alloc];
        [subscribeclass deleteFromArray: indexPath.row];
        [myTableView reloadData];
    }
}

这在我第一次删除一行时效果很好。但是当我删除第二行时,应用程序在 deleteFromArray 中的以下行崩溃:

[storedArray removeObjectAtIndex:number];

任何想法为什么?

【问题讨论】:

  • '-[__NSCFArray removeObjectAtIndex:]:变异方法发送到不可变对象'
  • 显然你的storedArrayNSArray,所以你不能调用那个方法。
  • 你在数组中存储了什么?
  • hukir 的回答解决了它!谢谢大家! :)

标签: ios uitableview cocoa-touch nsmutablearray


【解决方案1】:

来自 NSUserDefaults 的数组是 NSArray,而不是 NSMutableArray。你应该修改你的代码是这样的:

- (void)deleteFromArray:(NSUInteger) number{
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];  //load NSUserDefaults
    NSMutableArray *storedArray = [[prefs objectForKey:@"mydata"] mutableCopy];
    [storedArray removeObjectAtIndex:number];

    [prefs setObject:storedArray forKey:@"mydata"];
    [storedArray release];
    [prefs synchronize];
}

这会创建不可变数组的副本并使其可变,以便您可以修改它。

【讨论】:

    【解决方案2】:

    你只能在默认值中存储不可变 NSArrays 的东西。即使对象是可变的,它也被存储为不可变的

    所以不是

     NSMutableArray *storedArray = [[ NSMutableArray alloc] init];
     storedArray = [prefs objectForKey: @"mydata"];
    

    尝试:

     [NSMutableArray arrayWithArray:[prefs objectForKey: @"mydata"]];
    

    【讨论】:

      【解决方案3】:

      问题是 objectForKey 返回的数组是不可变的。 这样你就可以看到其他人做了什么:Storing custom objects in an NSMutableArray in NSUserDefaults

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多