如何修复枚举ZBarSymbolSet时发生突变的Objective-C代码?
解决枚举ZBarSymbolSet时集合被修改的崩溃问题
问题原因
这个崩溃是因为你用for-in循环枚举ZBarSymbolSet集合时,该集合被外部(比如ZBar的识别线程)修改了。ZBarSymbolSet属于动态更新的集合,枚举过程中集合内容发生变化就会触发NSGenericException。
修复方案
核心思路是先把原集合的元素复制到独立的数组副本中,再对数组进行枚举,这样原集合的修改就不会干扰枚举操作。
修改后的代码:
- (void) didTrackSymbols: (ZBarSymbolSet*) syms { if(!tracksSymbols) return; int n = syms.count; assert(n); if(!n) return; // 复制集合元素到独立数组,规避原集合被修改的问题 NSArray *symbolsArray = [syms allObjects]; ZBarSymbol *sym = nil; for(ZBarSymbol *s in symbolsArray) if(!sym || s.type == ZBAR_QRCODE || s.quality > sym.quality) sym = s; assert(sym); if(!sym) return; [self updateTracking: tracking withSymbol: sym]; }
补充说明
[syms allObjects]会一次性提取ZBarSymbolSet的所有元素生成NSArray副本,这个副本和原集合完全独立,后续原集合的更新不会影响它。- 对NSArray进行
for-in枚举时,只要不在枚举过程中修改这个数组,就不会触发异常,而我们的代码仅做读取操作,因此是安全的。
内容的提问来源于stack exchange,提问作者Ethan Allen
相关产品推荐
相关产品推荐

