You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复枚举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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 00:45:36