多线程访问共享数据的Bug

在不复制数组的情况下,多线程访问共享数据可能导致<__NSArrayM: 0x1781fc30>在枚举时被修改的错误。由于外部传入的是NSMutableArray,解决方案是在函数内部或外部复制一份数组。尝试在线程中复制会遇到新的崩溃问题:[NSArray initWithArray:range:copyItems:]: range {0, 4} exceeds bounds [0 .. 2],这表明在复制过程中外部修改了数组。最终,将复制操作放在主线程中解决了这个问题。" 53590223,1286220,1602显示器AD转换数据跳动问题解决,"['嵌入式开发', 'ADC', '中断处理', '微控制器', '数字信号处理']
摘要由CSDN通过智能技术生成

在数据存储的一个代码段里:

- (void)saveQunMessageBubbles:(NSArray *)msgList withCallbackBlock:(void (^)(NSArray *savedMessages))callbackBlock
{
    NSArray *constMsgList = [msgList copy];
    [_dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
        *rollback = NO;
        
        NSMutableArray *savedMessages = [[NSMutableArray alloc] init];
        for (QunMessage *msg in constMsgList) {
 


 最开始是没有copy数组的,那在for循环里就会有一个崩溃:类型为<__NSArrayM: 0x1781fc30> was mutated while being enumerated.在枚举的时候对array进行修改了。

原因就是穿进来的数组在外部是NSMutableArray。


解决方法是传进来之前copy一份,或者在这个函数里copy一份。如果传进去之前copy入口太分散了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值