2011-06-25 35 views
1

我有一個對UserDefaults起作用的對象。 它將數組添加到userdefaults中,然後在發生某些事件時將其刪除。 該對象可以有多個實例。iPhone - 解析NSMutableArray以移除對象

來自不同對象的實例來這些呼籲似乎發生碰撞併產生碰撞:

*** 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。

回答

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]; 
} 
+0

你確定嗎?我的數組包含NSDictionary對象。鍵碼是鍵值爲「鍵碼」的項目上的值。 – Oliver

+0

@奧利弗我確定。我正在提供關鍵路徑,以便它能夠正常工作。你可以用字典來做到這一點。因此你應該能夠測試它。 –

+0

我會試試。請問如果數組是一個具有.keycode屬性的自定義類insatnces的數組,應該怎麼做? – Oliver

0

你可以嘗試synchonizing添加/從陣列NSUserDefaults的

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; 
    } 
+0

while enumurate u have have modify the NSArray.so please use NSMutableArray which is mutable and will u。 –