首页 > iOS 请教一个崩溃的问题 困扰我很久了

iOS 请教一个崩溃的问题 困扰我很久了

是这样的 我是无法重现这个问题 是APP上线用户用出来的

dispatch_queue_t queue = dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    SDImageCache *imgCache = [[SDImageCache alloc] init];
    for (int i = 0; i < imgCount; i++) {
        dispatch_async(queue, ^{
            // 这句是从缓存中取图片 如果没有就网络下载并存入缓存
            UIImage *image = [self getImage:imgCache andArrayUrl:_photosArray[i]];
            if (![Utility isBlankObject:image] && _back!=1 && _imageArray) {
                [_imageArray addObject:image];
                if (_imageArray.count==2) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        // 执行图片动画
                        [self playImage];
                        _countDownTimer=[NSTimer scheduledTimerWithTimeInterval:(Animation_Time-0.2)
                                                                         target:self
                                                                       selector:@selector(playImage)
                                                                       userInfo:nil
                                                                        repeats:YES];
                    });       
                }
            }
            
            
        });
    }
    
-(void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];
    [_countDownTimer invalidate];
    _countDownTimer = nil;
    _back = 1;
}

日志的指向是这句[_imageArray addObject:image];出错了,我想问这样在一个生命周期中异步的添加数组并且有定时器可能会有什么问题 我看crash这个BUG会出现 但频率不是很高 一般2天会出现一次

Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY

0 libsystem_c.dylib 0x0000000180f1f560 usleep$NOCANCEL + 0 (usleep.c:47)
1 libsystem_c.dylib 0x0000000180f41db4 abort + 148 (abort.c:93)
2 libsystem_malloc.dylib 0x0000000180ffc374 free + 524 (malloc.c:1091)
3 CoreFoundation 0x000000018131a5bc -[__NSArrayM insertObject:atIndex:] + 284 (NSArray.m:590)
4 xxx 0x0000000100045d1c __42-[MovieDetailViewController initPhotoView]_block_invoke + 196 (MovieDetailViewController.m:274)
5 libdispatch.dylib 0x0000000180e814bc _dispatch_call_block_and_release + 24 (init.c:760)
6 libdispatch.dylib 0x0000000180e8147c _dispatch_client_callout + 16 (object.m:506)
7 libdispatch.dylib 0x0000000180e8f914 _dispatch_root_queue_drain + 2140 (inline_internal.h:1063)
8 libdispatch.dylib 0x0000000180e8f0b0 _dispatch_worker_thread3 + 112 (queue.c:4249)
9 libsystem_pthread.dylib 0x0000000181099470 _pthread_wqthread + 1092 (pthread.c:1990)
10 libsystem_pthread.dylib 0x0000000181099020 start_wqthread + 4 (pthread_asm.s:190)

274指向[_imageArray addObject:image] 在线等 真心急


可变数组不是线程安全的,在异步线程得加锁,我就知道这点


应该是线程安全问题


循环遍历时改变大小是很容易出问题的


遍历一个数组的时候,不应该往数组中做 add、remove 操作。

【热门文章】
【热门文章】