1. 程式人生 > >iOS 陣列遍歷刪除元素的問題

iOS 陣列遍歷刪除元素的問題

今天寫程式碼的時候,又是從實際中由問題引起而學到的新知識。很多時候,我們會用集合儲存物件,會根據業務需求,有時候需要遍歷集合,找出特定的物件,並把這個物件從集合中刪除。可能以為不會出什麼問題,結果小問題不斷啊,不過這些問題對我來說,可以是小細節的問題,問題再小,也是慢慢進步和掌握知識的過程啊。好,開始,描述問題:

比如我有個陣列,用來存放姓名的,然後在有需要的時候,遍歷這個陣列,刪除其中某個名字。

 self.names = [NSMutableArray arrayWithObjects:@"xiaoming", @"lilei", @"jim",@"green",nil];
    for(NSString *name in self.names)
    {
        if([name isEqualToString:@"jim"])
        {
            [self.names removeObject:name];
        }
    }

一執行,就會crash,然後報的錯誤是:

Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x8aae430> was mutated while being enumerated.

就是在列舉這個集合時的時候,出現了修改陣列的錯誤。這個錯誤,最基本,最容易看出的就是上面這段程式碼啊!在實際情況中,稍微複雜的就是多執行緒的情況下,由於沒做好同步,一個執行緒在訪問這個陣列,而另一個執行緒在修改,也會報這樣的錯誤。

當然修改這個錯誤很容易,一種就是換個列舉的方法:

   [self.names enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSString *name = (NSString*)obj;
        if([name isEqualToString:@"jim"])
        {
            [self.names removeObject:name];
            *stop = YES;
        }
    }];

這樣也就可以通過遍歷刪除需要的元素。