xcode - iOS block回调无法bad acess问题
本文介绍了xcode - 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在栈区。
这篇关于xcode - iOS block回调无法bad acess问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文