iPhone-解析NSMutableArray以删除对象

iPhone-解析NSMutableArray以删除对象,iphone,crash,nsuserdefaults,collision,Iphone,Crash,Nsuserdefaults,Collision,我有一个作用于UserDefaults的对象。 它将内容添加到数组中的userdefaults中,然后在发生某些事件时将其删除。 该对象可以有多个实例 来自不同对象实例的调用似乎会发生碰撞并产生崩溃: *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFArray: 0x66061e0> was mutated while being en

我有一个作用于UserDefaults的对象。 它将内容添加到数组中的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 = (
如何在不发生冲突的情况下从该阵列中添加/删除内容?
我不确定原因是许多使用默认值的对象导致了这次崩溃。我也怀疑这就是我解析数组的方式


我需要保留我的对象实例,并让它们运行process parralel。

您可以尝试同步NSUSerDefaults数组中的添加/删除操作

快速枚举数组时,决不能更改数组。它将引发一个异常,就像它为您所做的一样。您可以使用

        // ==========================================================================================================
    - (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;
    }
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];
}

在枚举时,您已经修改了NSArray。因此请使用NSMutableArray,它是可变的,可以帮助您。您确定吗?我的数组包含NSDictionary对象。keycode是项上的值,其键为“keycode”。@Oliver我确信。我提供的关键路径,所以它应该工作。你可以用字典来做。因此,你应该能够测试它。我试试看。如果数组是一个具有.keycode属性的自定义类insatnces数组,那么应该怎么做?如果它是一个属性,同样的事情也应该适用。谢谢你,你是一位大师:-)我正在阅读关于谓词的大量文档,在花数小时研究该文档之前,我只有一个问题。谓词在哪些上下文中可用?在这里,我们可以看到一个数组的例子,但是在其他情况下是否可以有效地使用谓词?
- (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];
}