首页 > iOS block回调无法bad acess问题

iOS block回调无法bad acess问题

代码里做了block回调,但是无法取到值,代码如下,麻烦看下,对于block不是很懂.问题应该是出在多线程上,dispatch after这句是在子现场执行的,直接报错了


    for (int i = 0; i<self.nativeVedioPathArr.count; i++) {

        __weak __typeof(self)weakSelf = self;
        [feedFile resumableUploadAndCallServerWithCallback:^(BOOL isSuccess, NSData * data, NSError * error) {
            if (isSuccess) {
                weakSelf.updatedVedioCount++;

                if (weakSelf.updatedVedioCount != weakSelf.nativeVedioPathArr.count) {

                }
                
                
            } else {

            }
            
            if (weakSelf.updatedVedioCount == weakSelf.nativeVedioPathArr.count) {
                dispatch_async(dispatch_get_global_queue(0, 0), ^{
                    [weakSelf deleteVedioPath];
                });
                if (weakSelf.nativeVedioPathArr.count == 1) {
                    __strong __typeof(weakSelf)strongSelf = weakSelf;
                    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                        [CoreSVP showSVPWithType:CoreSVPTypeSuccess Msg:@"上传视频完成" duration:0.5 allowEdit:nil beginBlock:nil completeBlock:^{
                            //上传成功后回调
                        strongSelf.completeVedioBlock(strongSelf.correctVedioPathArr.copy);
                        }];
                    });
                }
                
            }
        } withProgressCallback:^(float progress) {

        }];
    }


代码比较乱,大概看了一眼。
block 也不是很难就是封装一段代码,主要是行为比较复杂。
异步 + block 出现 坏访问, 一般都是线程时序问题。
我说block 和 多线程的注意点, 楼主可以自行去捋。
多线程下 哪条线程先被执行是不确定的, 捋一捋时序问题。
arc下默认是强引用
block 被强引用并且内部访问了自动变量(这个自动变量不是被弱引用修饰),那么block在堆区。
如果block 被强引用,但是内部访问的自动变量是弱引用, 比如 weakSelf ,那么block在栈区。

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