我有一个对UserDefaults起作用的对象。 它将数组中的内容添加到用户默认值中,然后在发生某些事件时将其删除。 该对象可以有多个实例。
来自不同对象实例的那些调用似乎发生冲突并产生崩溃:
*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFArray: 0x66061e0> was mutated while being enumerated.<CFArray 0x66061e0 [0xe38400]>{type = mutable-small, count = 3, values = (
我删除了这样的项目:
// ==========================================================================================================
- (void) deleteSavedItem:(NSString*)keycodeToDelete
// ==========================================================================================================
{
NSMutableArray* savedItems = [[self loadAllSavedItems] mutableCopy];
for (NSDictionary* dict in savedItems) {
NSString* keycode = [dict objectForKey:@"keycode"];
if ([keycode isEqualToString:keycodeToDelete])
[savedItems removeObject:dict];
}
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults setValue:savedItems forKey:@"savedItems"];
[defaults synchronize];
[savedItems release];
}
// ==========================================================================================================
- (NSArray*) loadAllSavedItems
// ==========================================================================================================
{
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSArray* savedItems = [defaults arrayForKey:@"savedItems"];
if (savedItems == nil) savedItems = [NSArray array];
return savedItems;
}
如何在没有碰撞的情况下添加/删除该数组中的内容? 我不确定原因是许多使用默认值的对象会导致此崩溃。我也怀疑这是解析数组的方式。
我需要保留我的对象实例,并让它们继续运行进程parralel。
答案 0 :(得分:3)
在快速枚举数组时,绝不能更改数组。它会像你一样引发异常。您可以使用
获取满足您条件的物品NSArray * matchingItems = [savedItems filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@" keycode MATCHES[cd] %@ ", keycodeToDelete]];
然后使用
删除它们[savedItems removeObjectsInArray:matchingItems];
修改后的deleteSavedItem:
将是。
- (void)deleteSavedItem:(NSString *)keycodeToDelete {
NSMutableArray * savedItems = [[self loadAllSavedItems] mutableCopy];
NSArray * matchingItems = [savedItems filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@" keycode MATCHES[cd] %@ ", keycodeToDelete]];
[savedItems removeObjectsInArray:matchingItems];
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
[defaults setValue:savedItems forKey:@"savedItems"];
[defaults synchronize];
[savedItems release];
}
答案 1 :(得分:0)
您可以尝试同步NSUSerDefaults数组中的添加/删除
答案 2 :(得分:0)
// ==========================================================================================================
- (void) deleteSavedItem:(NSString*)keycodeToDelete
// ==========================================================================================================
{
NSMutableArray* savedItems = [self loadAllSavedItems];
for (NSDictionary* dict in savedItems) {
NSString* keycode = [dict objectForKey:@"keycode"];
if ([keycode isEqualToString:keycodeToDelete])
[savedItems removeObject:dict];
}
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults setValue:savedItems forKey:@"savedItems"];
[defaults synchronize];
[savedItems release];
}
// ==========================================================================================================
- (NSMutableArray*) loadAllSavedItems
// ==========================================================================================================
{
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray* savedItems = [defaults arrayForKey:@"savedItems"];
if (savedItems == nil) savedItems = [[NSMutableArray alloc]init];
return savedItems;
}