NSMutableArray removeObjectAtIndex在第二次执行时崩溃

时间:2012-11-02 15:33:34

标签: ios uitableview cocoa-touch nsmutablearray

我有一个包含许多行的tableview,我希望能够删除这些行。填充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];

任何想法为什么?

3 个答案:

答案 0 :(得分:5)

来自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];
}

这会创建一个不可变数组的副本并使其可变,以便您可以对其进行修改。

答案 1 :(得分:1)

你只能在默认情况下存储不可变的NSArrays。即使对象是可变的,它也存储为不可变的

所以而不是

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

尝试:

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

答案 2 :(得分:0)

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