iOS 陣列遍歷刪除元素的問題
阿新 • • 發佈:2019-01-06
今天寫程式碼的時候,又是從實際中由問題引起而學到的新知識。很多時候,我們會用集合儲存物件,會根據業務需求,有時候需要遍歷集合,找出特定的物件,並把這個物件從集合中刪除。可能以為不會出什麼問題,結果小問題不斷啊,不過這些問題對我來說,可以是小細節的問題,問題再小,也是慢慢進步和掌握知識的過程啊。好,開始,描述問題:
比如我有個陣列,用來存放姓名的,然後在有需要的時候,遍歷這個陣列,刪除其中某個名字。
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;
}
}];
這樣也就可以通過遍歷刪除需要的元素。