NSMutableArray removeObjectAtIndex 在第二次执行时崩溃

Posted

技术标签:

【中文标题】NSMutableArray removeObjectAtIndex 在第二次执行时崩溃【英文标题】:NSMutableArray removeObjectAtIndex crashes on second execution 【发布时间】: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 的回答解决了它!谢谢大家! :) 【参考方案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

【讨论】:

以上是关于NSMutableArray removeObjectAtIndex 在第二次执行时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

将自定义对象存储到 NSMutableArray,然后将此 NSMutableArray 存储到 NSUserDefaults

访问另一个 NSMutableArray 中的对象的 NSMutableArray(即嵌套对象访问)

在过滤另一个 NSMutableArray 的基础上过滤 NSMutableArray

从 NSData 的 NSMutableArray 转换为 NSString 的 NSMutableArray?

如何使用 NSPredicate 从另一个 NSMutableArray 中过滤 NSMutableArray

NSMutableArray基本概念