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:]:变异方法发送到不可变对象' 显然你的storedArray
是NSArray
,所以你不能调用那个方法。
你在数组中存储了什么?
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?