多线程访问共享数据的Bug

来源:互联网 发布:儿童教育软件推荐 编辑:程序博客网 时间:2024/06/14 10:11

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

- (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入口太分散了。


开始的解决方法是在线程里copy一份,但是发现出现了另外一个崩溃:[NSArray initWithArray:range:copyItems:]: range {0, 4} extends beyond bounds [0 .. 2]

正在copy的时候,外面修改了这个array也会导致崩溃。最后只能将其放在主线程里copy。


0 0
原创粉丝点击